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

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

5 Comments

  1. Game-Mun.com says:

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

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

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

    where

    @Col_Name <. 0

    and @Col_Name IS NOT NULL

    and @Col_Name ‘N/A’

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

  2. นพ says:

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

  3. Game-Mun.com says:

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

    คือผมต้องการจะ ฝัง 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

  4. Game-Mun.com says:

    บอกจุดประสงค์ดีกว่า คือผมต้องการจะ 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

  5. นพ says:

    โห 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 นีี่ไม่เวิ๊กเหรอครับ ไม่ทราบว่าเข้าใจถูกหรือเปล่าอีกเหมือนกันนะคัพ แหะๆ

Leave a Reply