0

我想创建一个 SP 来使用 SQL 中的游标为所有表生成元数据。以下是我尝试过的代码。但它成为一个永无止境的循环,并且重复相同的数据。提前致谢。

--SELECT * FROM information_schema.columns 

ALTER PROCEDURE p1
AS

    SET NOCOUNT ON;

    DECLARE @id INT
        ,   @tablename VARCHAR(100)
        ,   @columnname VARCHAR(100)
        ,   @datatype VARCHAR(100)
        ,   @isnullable VARCHAR(100)

    BEGIN

        DECLARE CURSOR_1 CURSOR FOR
        SELECT  TABLE_NAME
            ,   COLUMN_NAME
            ,   DATA_TYPE
            ,   IS_NULLABLE
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'Employee' -- group BY table_name  

        OPEN CURSOR_1

        FETCH NEXT FROM CURSOR_1 INTO
            @tablename,
            @columnname,
            @datatype,
            @isnullable

        WHILE @@fetch_status = 0
        BEGIN
            INSERT INTO table_schema_detail (TABLE_NAME, COLUMN_NAME, DATA_TYPE, isnullable)
            VALUES (@tablename, @columnname, @datatype, @isnullable)
        END

        FETCH NEXT FROM CURSOR_1 INTO
            @tablename,
            @columnname,
            @datatype,
            @isnullable

        CLOSE CURSOR_1
        DEALLOCATE CURSOR_1

        SET NOCOUNT OFF;

    END
GO
4

3 回答 3

3

我真的不明白为什么需要将这些信息存储在表中,因为它已经在系统视图中可用(如果您仍然需要存储这些数据,为什么要使用游标?)。如果,就像您的评论所说,您需要存储 3 个表中的数据,那么您可以简单地执行以下操作:

INSERT INTO table_schema_detail(table_name,column_name,data_type,isnullable)
SELECT table_name, column_name, data_type, is_nullable 
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE table_name IN ('Employee','OtherTable1','OtherTable2')

但同样,我不明白这一点。至少您可以存储完成此操作的日期:

INSERT INTO table_schema_detail(table_name,column_name,data_type,isnullable,DateInserted)
SELECT table_name, column_name, data_type, is_nullable, GETDATE()
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE table_name IN ('Employee','OtherTable1','OtherTable2')
于 2013-09-02T17:30:31.320 回答
2

看看你在哪里有结束声明

insert INTO table_schema_detail(table_name,column_name,data_type,isnullable) VALUES(@tablename,@columnname,@datatype,@isnullable)
end

怀疑它永远不会到达这条线

FETCH NEXT FROM CURSOR_1 into

并同意其他评论是光标是正确的方法,但这是对所述问题的回答。

于 2013-09-02T20:23:25.910 回答
1

我认为从更可取的方式获取元数据sys.columns(在您的情况下,不需要光标):

INSERT INTO dbo.table_schema_detail 
(
      TABLE_NAME
    , COLUMN_NAME
    , DATA_TYPE
    , IS_NULLABLE
)
SELECT 
      SCHEMA_NAME(o.[schema_id]) + '.' + o.name
    , c.name
    , TYPE_NAME(c.system_type_id)
    , c.is_nullable 
FROM sys.columns c
JOIN sys.objects o ON c.[object_id] = o.[object_id]
WHERE SCHEMA_NAME(o.[schema_id]) + '.' + o.name = 'dbo.Employee'
    AND o.[type] = 'U'
于 2013-09-03T06:21:44.557 回答