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

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

Comments

Game-Mun.com Nov 5, 2008

คือตรงส่วนนี้ผมทำได้แล้ว แต่จะเอา Colum ที่ได้

ไปตรวจสอบอีกทีว่า Colum ไหน มีค่า

โดยใช้ Cursor เก็บเข้าไปที่ @Col_Name

where

@Col_Name <. 0

and @Col_Name IS NOT NULL

and @Col_Name ‘N/A’

แล้วมันไม่ได้อะครับ จะทำยังไงดี

นพ Nov 6, 2008

ผมว่าเอา select * (select * from a where b = c) as e ได้เปล่าอะคัพ คือเอาไปคร่อม แล้วค่อย where ตอนค่อมอะคัพ

Game-Mun.com Nov 25, 2008

ใช้ได้หมดแล้วครับ แต่ตอนนี้เจอปัญหาใหม่

คือผมต้องการจะ ฝัง procedure ไว้อีก db นึง และให้มันมาเรียกอีก db นึง

แต่ใช้ คำสั่งนี้ มันจะไม่ได้ เพราะมันข้าม db มีวิธีเปลี่ยนแปลง script รึเปล่าครับ

SELECT B.NAME AS COLUMN_NAME , C.NAME AS TYPE
FROM SYSOBJECTS A,SYSCOLUMNS B,SYSTYPES C
WHERE A.ID = B.ID AND A.XTYPE = ‘U’ AND A.NAME = ‘BI.BI_SAL.dbo.BsaleProdMth’ AND
B.XUSERTYPE = C.XUSERTYPE

script นี้ถ้าใช้กับ table ใน base ตัวเองได้ครับ แต่ผมจะเอาไปใช้ดึงค่า column จาก base อื่นมา
BI.BI_SAL.dbo.BsaleProdMth อยู่อีก base จึง link server ด้วย BI

Game-Mun.com Nov 26, 2008

บอกจุดประสงค์ดีกว่า คือผมต้องการจะ Check Field ทั้งหมดว่า Field ไหน

เป็น 0, ‘N/A’, NULL ผมจะไปบังคับให้เวลาดึงไปที่โปรแกรมไม่โชก็คือ

set @Flag = ‘N’ อะครับ ตอนนี้ที่ base เดียวกัน ทำได้แล้ว

แต่ติดเมื่อนำ procedure ไปวางที่อื่น แล้วจะ check ข้าม Base

ถ้าทำไม่ได้จริงๆ คงต้อง manual script เอาละครับ

ส่วนนี่เป็น procedure ที่เขียนไว้

CREATE PROCEDURE usp_UpdShowFlag
@Com_Id INT,
@Dep_Id INT,
@Obj_Id INT,
@Usr_Id INT,
@Level_Id INT,
@Template_Id INT,
@Db_Name VARCHAR(100),
@Table_Name VARCHAR(8000)

AS
BEGIN
DECLARE @Col_Name VARCHAR(1000)
DECLARE @Data_Type VARCHAR(1000)
DECLARE @SELECT VARCHAR(8000)
DECLARE @First_Rec VARCHAR(1)
DECLARE @Flag VARCHAR(1)

BEGIN TRY

DECLARE MTEMPLATEITEM_COL_NAME CURSOR FOR
SELECT B.NAME AS COLUMN_NAME , C.NAME AS TYPE
FROM SYSOBJECTS A,SYSCOLUMNS B,SYSTYPES C
WHERE A.ID = B.ID AND A.XTYPE = ‘U’ AND A.NAME IN (@Table_Name) AND
B.XUSERTYPE = C.XUSERTYPE

OPEN MTEMPLATEITEM_COL_NAME

SET @First_Rec = ‘Y’

FETCH NEXT FROM MTEMPLATEITEM_COL_NAME
INTO @Col_Name, @Data_Type

WHILE @@FETCH_STATUS = 0
BEGIN
IF @First_Rec = ‘Y’
BEGIN
SET @First_Rec = ‘N’

— IF @Data_Type = ‘varchar’ — Before Update 14/11/52
IF @Data_Type = ‘varchar’ OR @Data_Type = ‘char’

BEGIN
SET @SELECT = ‘SELECT COUNT(‘
+ @Col_Name +
‘ ) as Row_Count INTO ##tempL From ‘
+ @Db_Name +
+ @Table_Name +
‘ Where ‘
+ @Col_Name +
‘ ”0” and CONVERT(VARCHAR(20), ‘
+ @Col_Name +
‘ ) IS NOT NULL
and CONVERT(VARCHAR(20), ‘
+ @Col_Name +
‘ ) ”N/A” ‘

END
ELSE
BEGIN
SET @SELECT = ‘SELECT COUNT(‘
+ @Col_Name +
‘ ) as Row_Count INTO ##tempL From ‘
+ @Db_Name +
+ @Table_Name +
‘ Where ‘
+ @Col_Name +
‘ 0 and CONVERT(VARCHAR(20), ‘
+ @Col_Name +
‘ ) IS NOT NULL
AND CONVERT(VARCHAR(20), ‘
+ @Col_Name +
‘ ) ”N/A” ‘

END

EXEC (@SELECT) — if column is string will be error

IF (SELECT Row_Count FROM ##tempL) > 0
SET @Flag = ‘Y’
ELSE
SET @Flag = ‘N’

WHILE @Flag = ‘Y’ — OR @Flag = ‘N’
BEGIN
IF EXISTS(SELECT TOP 1 Err_Log_Id FROM MAS.dbo.TErrLog WHERE @Col_Name LIKE ‘%_Id’)
–use MAS.mas.dbo.TERRLOG because check only @Col_name
BEGIN
SET @Flag = ‘N’
BREAK
END
ELSE BREAK
END

DROP TABLE ##TempL –Drop Temp Table

UPDATE MTI SET Show_Flag = @Flag –, Template_Id = ’99′ — Test 77 > , Template_Id = ’99′
FROM MAS.dbo.MTemplateItem AS MTI
WHERE MTI.Col_Name = @Col_Name
AND Template_Id = @Template_Id

END

ELSE
BEGIN

IF @Data_Type = ‘varchar’ OR @Data_Type = ‘char’

BEGIN
SET @SELECT = ‘SELECT COUNT(‘
+ @Col_Name +
‘ ) as Row_Count INTO ##tempL From ‘
+ @Db_Name +
+ @Table_Name +
‘ Where ‘
+ @Col_Name +
‘ ”0” and CONVERT(VARCHAR(20), ‘
+ @Col_Name +
‘ ) IS NOT NULL
AND CONVERT(VARCHAR(20), ‘
+ @Col_Name +
‘ ) ”N/A” ‘

END
ELSE
BEGIN
SET @SELECT = ‘SELECT COUNT(‘
+ @Col_Name +
‘ ) as Row_Count INTO ##tempL From ‘
+ @Db_Name +
+ @Table_Name +
‘ Where ‘
+ @Col_Name +
‘ 0 and CONVERT(VARCHAR(20), ‘
+ @Col_Name +
‘ ) IS NOT NULL
AND CONVERT(VARCHAR(20), ‘
+ @Col_Name +
‘ ) ”N/A” ‘

END

EXEC (@SELECT)

IF (SELECT Row_Count FROM ##tempL) > 0
SET @Flag = ‘Y’

ELSE
SET @Flag = ‘N’

WHILE @Flag = ‘Y’ — OR @Flag = ‘N’
BEGIN
IF EXISTS(SELECT TOP 1 Err_Log_Id FROM MAS.dbo.TErrLog WHERE @Col_Name LIKE ‘%_Id’)

BEGIN
SET @Flag = ‘N’
BREAK
END
ELSE BREAK
END

DROP TABLE ##TEMPL
UPDATE MTI SET Show_Flag = @Flag –, Template_Id = ’99′– Test > , Template_Id = ’99′
FROM MAS.dbo.MTemplateItem AS MTI
WHERE MTI.Col_Name = @Col_Name
AND Template_Id = @Template_Id
END

FETCH NEXT FROM MTEMPLATEITEM_COL_NAME
INTO @Col_Name, @Data_Type

END

CLOSE MTEMPLATEITEM_COL_NAME
DEALLOCATE MTEMPLATEITEM_COL_NAME

END TRY
BEGIN CATCH
BEGIN TRY
INSERT INTO MAS.dbo.TErrLog
(Com_Id, Usr_Id, Obj_Id, Dep_Id, Err_Datetime, Err_No, Err_Line, Err_Base_Proc, Err_Proc, Err_Message, Status_Flag, Resolve_By, Resolve_Date)
VALUES (@Com_Id, @Usr_Id, @Obj_Id, @Dep_Id, GETDATE(), ERROR_NUMBER(), ERROR_LINE(), ‘usp_UpdShowFlag’, ERROR_PROCEDURE(), ERROR_MESSAGE(), ‘N’, null, null)
END TRY
BEGIN CATCH
INSERT INTO MAS.dbo.TErrLog
(Com_Id, Usr_Id, Obj_Id, Dep_Id, Err_Datetime, Err_No, Err_Line, Err_Base_Proc, Err_Proc, Err_Message, Status_Flag, Resolve_By, Resolve_Date)
VALUES (@Com_Id, @Usr_Id, @Obj_Id, @Dep_Id, GETDATE(), ERROR_NUMBER(), ERROR_LINE(), ‘usp_UpdShowFlag’, ‘INSERT INTO MAS.mas.dbo.TErrLog’, ERROR_MESSAGE(), ‘N’, null, null)
END CATCH
END CATCH
END

นพ Nov 26, 2008

โห script เทพฯ อย่างอย่างนี้ add link server แล้วใช่ปะคัพ ถ้า add link server แล้ว ดึง จาก store proc เข้าตัวแปลก่อนได้มั้ย แล้ว ตอน

AND A.NAME = ‘BI.BI_SAL.dbo.BsaleProdMth’ AND
ค่อย
AND A.NAME = @ตัวแปรแทน

ไม่ทราบว่าเข้าใจถูกหรือเปล่านะคัพ

ปล. สคริป สุดยอดจริงๆคัพ

ปล. แล้วอย่างนี้ใช้ แค่ isnull(filed,0) แล้วก้อ ผสมๆ กะ case เพื่อสร้าง filed flag นีี่ไม่เวิ๊กเหรอครับ ไม่ทราบว่าเข้าใจถูกหรือเปล่าอีกเหมือนกันนะคัพ แหะๆ

เม้นท์กันซะหน่อย