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时,尽可能引用对象和参数值的关键方法。正确!我应该加上引号。我现在改变了!