WP Remix
Nop Pinyowanichaka | ก้าวสั้นๆ ในวันเบาๆ ของผม
Ewery

MSSQL

Microsoft SQL

4
Apr
2008

คราวที่แล้วเขียน SP สร้าง ตารางวันที่ แต่ไอ้ตอนที่แปลง Format มันแปลง ดุ้นๆ ไปไม่ค่อยเวิ๊ก อันนี้เป็นการจัด Format Datetime อย่างเป็นทางการ

อันนี้เป็น format นี้ 05-04-2008

SELECT CONVERT(varchar(10), getdate()+1, 105)

อันนี้เป็น format นี้ 05/04/2008

SELECT CONVERT(varchar(10), getdate()+1, 103)

ปล. ที่ต้อง +1 ให้กับ getdate() ก็เพราะว่า มันเป็นวันที่ 4 เดือน 4 เดี๋ยวจะงง

Category : MSSQL | Blog
26
Mar
2008

การเอา Textfile เข้า ฐานข้อมูล MSSQL จริงๆ ไม่ต้องใช้ Temptable ก็ได้ ถ้าใช้บ่อย สร้างเป็นถาวรก็น่าจะใช้งานได้ง่ายกว่า แต่สำหรับผมเองผมว่าเอาเข้า Temptable ไว้ก่อน แล้วค่อยเอามาใช้จริงๆ แต่สำหรับการเขียน Webที่ Connection เปิดหนึ่งครั้ง ปิดหนึ่งครั้ง Temptable ก็หายไปบางครั้งก็คงไม่เหมาะ

ขั้นแรกก็สร้าง Temptable ซะก่อน ด้วยคำสั่ง Create table ธรรมดานี่แหละครับ เพียงแต่ใส่ # ไว้ข้างหน้าเพื่อบอกว่าเป็น Temptable

1
2
3
4
5
CREATE TABLE #tempdata (
id varchar(4),
usr VARCHAR(100),
pwd VARCHAR(100)
)

อ่านต่อ

Category : MSSQL | Blog
26
Mar
2008

เขียน MSSQL store procedure เพื่อทำ Crosstab หรือ Pivot Table

วันก่อน มีโอกาสต้องเขียน การแสดงผลข้อมูลเป็นแบบ แนวนอน หรือที่เค้าเรียกกันว่า Crosstab แต่เนื่องด้วย ฐานข้อมูลที่ใช้ มันเป็น MSSQL 2000 มันไม่มีพวก Pivot Table มาให้ (Access ยังมีเลย) เลยต้องหาเอาเอง ไปเจอเว็บนึงเค้า เขียนเป็น Store Procedure ไว้ เอามาใช้ Work เลยทีเดียว ตอบโจทย์ได้เลย

ตัวอย่างของ Data

Year Region Income
Y2007 North 20
Y2007 South 10
Y2007 East 30
Y2006 North 10

Y2006 South 10

Y2006 East 10

เมื่อทำ Crosstab แล้วจะได้แบบนี้

Year North South East
Y2006 10 10 10
Y2007 20 10 30

อ้าวแล้วทำยังไงให้ได้แบบนี้ล่ะ มาดูวิธีการกันเลยครับ

อ่านต่อ

Category : MSSQL | Blog
27
Feb
2008

วันนี้มีความต้องการสร้างฐานข้อมูลวันที่ในตารางของ MSSQL แต่ให้ไปนั่ง Key เอาหรือไป Copy เอาคงไม่ไหว เลยเขียน Script เอาไว้สร้างวันที่เอาไว้เผื่อใครเอาไปใช้ครับ

declare @i int
declare  @CAL_DATE datetime
SET @i=0
while (@i < 1825)
begin
	-- เอาวันพรุ่งนี้เข้า
	SET @CAL_DATE = (SELECT REPLACE(CONVERT(varchar(11), GETDATE()+@i, 111),'/','-'))
	INSERT INTO MS_CALENDAR (CAL_DATE) VALUES (@CAL_DATE)
	-- เอาวันพรุ่งนี้เข้า
	-- เอาเมื่อวานเข้า
	SET @CAL_DATE = (SELECT REPLACE(CONVERT(varchar(11), GETDATE()-@i, 111),'/','-'))
	INSERT INTO MS_CALENDAR (CAL_DATE) VALUES (@CAL_DATE)
	-- เอาเมื่อวานเข้า
	SET @i=@i+1
end
Category : MSSQL | Blog
11
Feb
2008

ทำการ Add Server ด้วย System Store Procedure ก่อน ด้วยคำสั่ง

use Master

EXEC sp_addlinkedserver
   @server = servername ,
   @provider = ‘MSDASQL’,
   @provstr = ‘DRIVER={SQL Server};SERVER=servername;UID=user;PWD=password;’

หลังจากนั้น ก็รัน SP เพื่อ ปรับ Config Data Access

EXEC sp_serveroption ‘178.55.1.3′, ‘data access’, ‘TRUE’

ถ้าไม่รันคำสั่งนี้ จะขึ้น Error อันนี้

servername is not configured for DATA ACCESS.

เท่านี้เราก็สามารถเรียก Table ของ MSSQL ข้าม Server ได้แล้ว

เช่นถ้าต้องการเรียก Table ABC บน Database ADatabase ที่อยู่ใน AServer ก้อจะเรียกดังนี้

select * from [Aserver].ADatabase.dbo.ABC เป็นต้น

Powered by ScribeFire.

Category : MSSQL | Blog
13
Dec
2007

Script สำหรับสร้าง Datadict สำหรับ MSSQL

select  b.colid as [ID] , a.NAME as TABLE_NAME  , b.name  as COLUMN_NAME ,   c.name  as [TYPE], b.length as SIZE
from sysobjects a,syscolumns b,systypes c
where a.id = b.id  and a.xtype = 'U' and a.name in ('MS_TRANSPORT_MODEL') and
b.xusertype = c.xusertype
Category : MSSQL | Blog
12
Dec
2007

Could not allocate ancillary table for view or function resolution. The maximum number of tables in a query (260) was exceeded.

เหตุเกิดที่ว่าผมต้องสร้าง View เพื่อทำการตรวจสอบผลการทำงานทั้งหมดของระบบ เนื่องจากต้องไปวิ่งไล่ Table แทบทั้ง Database เพื่อทำการตรวจสอบความถูกต้องของข้อมูล ปรากฏว่ามัน Join กันเยอะเกินไป จากหลายๆ Table มันเลย แจ้งว่า The maximum number of tables in a query (260) was exceeded. คือ เลือก Table มามากเกินไปใน Query วิธีแก้ไขของผมคือไปสร้าง Function มาแทน แล้วใน View นี้ไปเรียก Function ที่ไปเรื่อง Table เยอะๆ อีกทีนึง (จริงๆมันก็ช้านะครับ แต่ผมรับได้กับการตรวจสอบความถูกต้องของข้อมูลก่อนนำเข้าระบบหลักแบบนี้)

Category : MSSQL | Blog
11
Dec
2007

ไม่ได้เขียน Blog เสียนาน เพราะไม่ค่อยมีเรื่องอะไรใหม่ๆ ในชีวิต แล้วก็หนีไปบวชมา เลยไม่ได้เขียนมาซะนาน วันนี้ได้โจทย์ว่าต้อง Delay การแสดงผล หรือ การอัพเดตข้อมูลชุด หนึ่ง ก่อนอีกชุดนึงมา ลองค้นๆ MSSQL มี คำสั่งในการชะลอการทำงาน ดังนี้

waitfor delay ‘00:00:01′

อันนี้คือ รอ 1 วินาที

ตัวอย่าง

select getdate()
waitfor delay ‘00:00:02′
select getdate()

ผลลัพท์

2007-12-11 13:26:19.163
2007-12-11 13:26:21.180

ต่างกัน 2 วินาที

เสร็จครับ

Category : MSSQL | Blog
20
Jul
2007

ไม่ได้เขียนมาซะนานเนื่องจากงานยุ่ง วันก่อนมีพี่คนนึงถามว่า

“เอ๊ะ ใน MSSQL มี Function Hex To Decimal และ Decimal to Hex มั้ย?”

ผมก็เอาเลยเริ่มค้นหา ก็ทำให้รู้ว่ามันไม่มี Function นี้ในตัวของมันเอง ต้องเขียนเอง เลยลองค้นๆใน Google ดู ก็พบ Function ที่ Work!! ลองเอาไปใช้งานกันดูครับ

อ่านต่อ

Category : MSSQL | Blog
28
Jun
2007
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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
Category : MSSQL | Blog