CREATE FUNCTION dbo.Split(@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (Items nvarchar(4000))
AS BEGIN
DECLARE @INDEX INT
DECLARE @SLICE nvarchar(4000)
-- HAVE TO SET TO 1 SO IT DOESNT EQUAL Z
-- ERO FIRST TIME IN LOOP
SELECT @INDEX = 1
WHILE @INDEX !=0
BEGIN
-- GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
-- NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE
IF @INDEX !=0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
ELSE
SELECT @SLICE = @STRING
-- PUT THE ITEM INTO THE RESULTS SET
INSERT INTO @Results(Items) VALUES(@SLICE)
-- CHOP THE ITEM REMOVED OFF THE MAIN STRING
SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
-- BREAK OUT IF WE ARE DONE
IF LEN(@STRING) = 0 BREAK
END
RETURN
END
คลังเก็บหมวดหมู่: Database
Is there For Loop in MSSQL?
ใน MSSQL มี For Loop หรือเปล่า นี่คือคำถาม จากที่ลอง Search ๆ ดูแล้วปรากฏไม่มีนะครับ แต่สามารถใช้ While แทนได้ดังตัวอย่างคัพ
declare @i int
set @i=0
while (@i<10)
begin
print @i
set @i=@i+1
end
ลองรันกันดูคัพ
MSSQL Result ??? in Result Set
ในกรณีที่เราเรียกดูข้อมูลจาก MSSQL แล้ว ผลที่ ได้จากการ Run Query ในโปรแกรมที่เขียนด้วย PHP หรือ ASP แล้วแสดงผลกลับมาเป็น ???
จากที่ผมเคยเจอ ผมได้ทำการเปลี่ยน Regional and Language Options แล้วจะทำให้ Return เป็น ภาษาไทยตามความต้องการ
วิธีการเปลี่ยน
ไปที่ Control Panel คลิกที่ Regional and Language Options ดังรูป

Hide system tables in SQL Server Enterprise Manager
ซ่อน System Table ใน SQL Server Enterprise Manager
หลายครั้งหลายครา ที่เปิด MS SQL Enterprise Manager หรือ Query Analyzer ขึ้นมาจะมี Table ที่เป็น ของ system อยู่ ซึ่ง จริง ๆ เราแทบไม่ต้องใช้ในการทำงานปกติ วิธี การ ปิดไม่ให้ Table ประเภทนี้แสดงผล สามารถทำได้ดังนี้
อ่านเพิ่มเติม
Mysql Old Password
ปัญหา MySQL Old Password
ปัญหานี้เกิดจาก การที่ MySQL มีการเปลี่ยนแปลงกระบวนการในการเข้ารหัส password ของ user
ผลก็คือ ทำให้ client รุ่นเก่า ไม่สามารถติดต่อ MySQL ได้ ซึ่งกลไกดังกล่าว มีใช้ใน MySQL 4.1 เป็นต้นไป
แต่เราสามารถสั่งให้ MySQL สามารถใช้ OLD_PASSWORD() เพื่อกำหนดให้ MySQL ใช้รูปแบบการจัดเก็บ password แบบเดิมได้ เช่น
CODE
mysql> SET PASSWORD FOR ‘some_user’@’some_host’ = OLD_PASSWORD(‘newpwd’);
หรือการมี user อยู่แล้ว
CODE
mysql> UPDATE mysql.user SET Password = OLD_PASSWORD(‘newpwd’)
WHERE Host = ‘some_host’ AND User = ‘some_user’;
mysql> FLUSH PRIVILEGES;
ถ้าคุณมี user อยู่เป็นพัน เปลี่ยนแบบนี้คงไม่ไหวแน่ กรณีนี้ให้สั่ง MySQL ทำงานคู่กับ parameter –old-passwords
CODE
mysqld –old-passwords
การใช้ cursor ในการอัพเดตข้อมูล เร็วกว่า การเขียนโปรแกรม?
ฝาก code ไว้ในอ้อมใจ
begin tran g4
DECLARE @EMPLOYEE_CODE varchar(8) ,
@DEPARTMENT_CODE varchar(4) --ประกาศค่าตัวแปลในที่นี้เป็นหมายเลขบัญชี
DECLARE tempEMP CURSOR FOR -- ประกาศชื่อ tempAR เป็น Cursor
SELECt employee_code,department_code FROM tmp_emperror -- query statement ดึงข้อมูล
OPEN tempEMP
FETCH NEXT FROM tempEMP into @EMPLOYEE_CODE ,@DEPARTMENT_CODE -- นำค่า employee_code และ department_code ใน table มาใส่ใน ตัวแปล @ARD_ACC_NO ของ mssql
WHILE (@@FETCH_STATUS = 0) -- วนลูปคัพ
BEGIN
update table_exp_emp_detail set department_code = @DEPARTMENT_CODE where employee_code = @EMPLOYEE_CODE
FETCH NEXT FROM tempEMP into @EMPLOYEE_CODE ,@DEPARTMENT_CODE -- loop นั่นเอง
END
CLOSE tempEMP
DEALLOCATE tempEMP
rollback tran g4
การหาค่าซ้ำใน Table
หาค่าซ้ำ
SELECT column,COUNT(*) c FROM table
GROUP BY column HAVING COUNT(*) > 1
อันนี้หาหลายฟิลล์
SELECT EMP_CODE,COUNT(*) c FROM department
GROUP BY EMP_CODE ,is_active HAVING COUNT(*) > 1 and is_active = 'Y'
การป้องกันการอัพเดตผิดพลาดใน Query Analysis MSSQL
บางครั้งเราชอบเขียน Code SQL เยอะๆ หลายบรรทัด แล้วค่อย รัน query ที่เลือกไว้ ใน Query Analyser
แต่ในบางครั้ง เราเขียน query ที่มีการอัพเดต query ด้วย ซึ่ง จะมีกระทบอย่างแรงกับ Database ของเรา
วิธีป้องกันความผิดพลาดแบบนั้น ทำได้ง่ายๆ คือ ลบ query ที่ไม่ใช้ใน Query Analyser ทิ้งซะก่อน แต่น้อยคนจะทำ ผมจึงนำเสนอวิธีใหม่ โดยใช้ Transaction เข้ามาช่วย
โดยการ เขียน
begin tran t3
--query ต่างๆ
rollback tran t3
ซึ่งถ้าเราพลาดกด f5 โดยยังไม่ได้ เลือก query ทุกอย่างจะไม่กระทำ โอ้จอรจ์ เหมาะกะคนอย่างผมจิงๆ
Microsof SQL Insert from Table อื่น | mssql insert from
ในกรณีที่อยู่ใน Table เดียวกัน ต้องการ Duplicate เช่น อาจจะเป็นการ Copy Group เป็นต้น
INSERT INTO table1 (f1, f2) SELECT f1, f2 FROM table1 where f1 = '?'
กรณีเป็น Table อื่น
INSERT INTO table1 (f1, f2) SELECT f3, f4 FROM table2 where f1 = '?'
อันนี้ประมาณว่า Field ต้อง Datatype เดียวกันนะครับ
รายละเอียดการ Insert From จากเว็บ www.sqlteam.com
คำค้นที่น่าจะเกี่ยวข้อง
sql insert from select
mssql insert from another table
