使用光标的动态字段名称

时间:2015-12-11 17:05:01

标签: sql sql-server tsql cursor

我试图动态地打印每个架构和表中的字段列表。因为我需要打印以供进一步参考而不是表格,所以我使用光标将它们打印出来,如下所示:

DECLARE AutoFields CURSOR
FOR
    SELECT TABLE_SCHEMA,TABLE_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
OPEN AutoFields
DECLARE @TableSchema NVARCHAR(100)
DECLARE @TableName NVARCHAR(100)

FETCH NEXT
FROM AutoFields
INTO @TableSchema,@TableName

WHILE @@FETCH_STATUS = 0
BEGIN
    EXECUTE('
            SELECT COLUMN_NAME
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_SCHEMA=@TableSchema
            AND TABLE_NAME=@TableName
           ')
     FETCH NEXT
     FROM AutoFields
     INTO @TableSchema,@TableName
END 

CLOSE AutoFields
DEALLOCATE AutoFields

但我一遍又一遍地得到这个错误:

  

必须声明标量变量" @ TableSchema"。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

您需要使用变量来连接动态字符串,而不是它的一部分。像这样:

EXECUTE('
        SELECT COLUMN_NAME
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_SCHEMA= ''' + @TableSchema + '''
        AND TABLE_NAME= ''' + @TableName + '''
       ')

答案 1 :(得分:1)

为什么你不能写

SELECT COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS

我认为你需要在CURSOR

中使用它
DECLARE AutoFields CURSOR
FOR
    SELECT TABLE_SCHEMA,TABLE_NAME
    FROM INFORMATION_SCHEMA.tables --Not Columns