Sql server CREATEINSERT INTO语句传递变量列表,如列列表

Sql server CREATEINSERT INTO语句传递变量列表,如列列表,sql-server,tsql,Sql Server,Tsql,我有一个小语句来提取表中列的列表: DECLARE @j INT = 1 DECLARE @verifyColumn INT = @pkcounter --it count the number of column of the table WHILE @j <> @verifyColumn +1 BEGIN set @multipleColumn = @multipleColumn+ (SELECT COLUMN_NAME FROM INFORMATION_

我有一个小语句来提取表中列的列表:

DECLARE @j INT = 1
DECLARE @verifyColumn INT = @pkcounter --it count the number of column of the table
WHILE @j <> @verifyColumn +1
    BEGIN
        set @multipleColumn = @multipleColumn+ (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMN WHERE TABLE_SCHEMA = @schema_name AND TABLE_NAME = @table_source AND ORDINAL_POSITION = @k) + ','
        SET @j = @j + 1
        set @k = @k + 1
        SET @pkcounter = @pkcounter - 1;
    END

PRINT 'multipleColumn: ' + @multipleColumn
有可能吗?
谢谢大家

不,您必须使用sp_executesql。像这样:

DECLARE @multipleColumn VARCHAR(1000) = NULL, -- Must be null
    @schema_name NVARCHAR(128)='dbo',
    @table_source NVARCHAR(128)='<src>',
    @table_target NVARCHAR(128)='<dest>',
    @stmt NVARCHAR(MAX);

SELECT @multipleColumn = COALESCE(@multipleColumn+', ', '') + QUOTENAME(c.COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS AS c
WHERE
    c.TABLE_SCHEMA = @schema_name
    AND c.TABLE_NAME = @table_source;

SET @stmt=CONCAT('INSERT INTO ', QUOTENAME(@table_target),' (', @multipleColumn, ')
SELECT ', @multipleColumn, ' FROM ', QUOTENAME(@table_source), ';');

EXEC sp_executesql @stmt;

而且,和往常一样,在使用sp_executesql时要小心

否,必须使用sp_executesql。像这样:

DECLARE @multipleColumn VARCHAR(1000) = NULL, -- Must be null
    @schema_name NVARCHAR(128)='dbo',
    @table_source NVARCHAR(128)='<src>',
    @table_target NVARCHAR(128)='<dest>',
    @stmt NVARCHAR(MAX);

SELECT @multipleColumn = COALESCE(@multipleColumn+', ', '') + QUOTENAME(c.COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS AS c
WHERE
    c.TABLE_SCHEMA = @schema_name
    AND c.TABLE_NAME = @table_source;

SET @stmt=CONCAT('INSERT INTO ', QUOTENAME(@table_target),' (', @multipleColumn, ')
SELECT ', @multipleColumn, ' FROM ', QUOTENAME(@table_source), ';');

EXEC sp_executesql @stmt;

而且,和往常一样,在使用sp_executesql时要小心

不幸的是,不是这样。您必须使用动态SQL。您的SELECT仅包含2列,因此当为列列表返回多于/少于2列时,您希望发生什么情况?它会出错是故意的吗?不幸的是,不是这样。您必须使用动态SQL。您的SELECT仅包含2列,因此当为列列表返回多于/少于2列时,您希望发生什么情况?它会出错是故意的吗?正如您所知,注入是一个问题,为什么没有使用QUOTENAME?也不是sp_executesql对注入开放,它连接字符串而不是清除值,这是注入问题。类似于EXEC sp_executesql N'SELECT 1 AS One;';永远不能忍受注射。确保在使用动态SQL时,尽可能引用对象和参数值的关键方法。正确!我应该加上引号。我现在改变了!正如您所知,注入是一个问题,为什么您没有使用QUOTENAME?注入问题也不是sp_executesql,而是连接字符串,而不是清除值。类似于EXEC sp_executesql N'SELECT 1 AS One;';永远不能忍受注射。确保在使用动态SQL时,尽可能引用对象和参数值的关键方法。正确!我应该加上引号。我现在改变了!