Posted by
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
คือตรงส่วนนี้ผมทำได้แล้ว แต่จะเอา Colum ที่ได้
ไปตรวจสอบอีกทีว่า Colum ไหน มีค่า
โดยใช้ Cursor เก็บเข้าไปที่ @Col_Name
where
@Col_Name <. 0
and @Col_Name IS NOT NULL
and @Col_Name ‘N/A’
แล้วมันไม่ได้อะครับ จะทำยังไงดี
ผมว่าเอา select * (select * from a where b = c) as e ได้เปล่าอะคัพ คือเอาไปคร่อม แล้วค่อย where ตอนค่อมอะคัพ
ใช้ได้หมดแล้วครับ แต่ตอนนี้เจอปัญหาใหม่
คือผมต้องการจะ ฝัง 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
บอกจุดประสงค์ดีกว่า คือผมต้องการจะ 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
โห 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 นีี่ไม่เวิ๊กเหรอครับ ไม่ทราบว่าเข้าใจถูกหรือเปล่าอีกเหมือนกันนะคัพ แหะๆ