动态 SQL - 通过 INSERT INTO x SELECT 语句插入变量

Dynamic SQL - Insert a variables via INSERT INTO x SELECT statement

我想问一下如何通过动态 SQL.

使用 INSERT INTO x SELECT 语句将变量插入 table

我关注table:

 |-------------------|-----------------|--------------|-----------------|
 |     TableName     |     ColName     |     Value    |  SQL_Statement  |
 |-------------------|-----------------|--------------|-----------------|

我通过此查询获得 Value 列的内容:

INSERT INTO #ReturnTable(Value) SELECT TreeHolder FROM prm.Schm_Root WHERE ParentTreeHolderId = 'DD040D31-4591-4658-A02E-A6ED00AB64F2';

但我需要填写整个 table。请考虑其他值是变量,而不是 SQL 查询。

SELECT @TableSchema = TableSchema FROM #TableNames WHERE Id = @Counter;
SELECT @TableName = TableName FROM #TableNames WHERE Id = @Counter;
SELECT @ColName = ColName FROM #TableNames WHERE Id = @Counter;
SET @SQL_Statement = 'SELECT ' + @ColName + ' FROM ' + @TableSchema + '.' + @TableName + ' WHERE ' + @ColName + ' = ' + '''''' + CAST(@GuidArgument AS NVARCHAR(50)) + '''''' + ';';

现在我有这个查询来填充 table:

SET @SQL_String = N'INSERT INTO #ReturnTable SELECT
''' + @TableName + ''',
''' + @ColName + ''',
''' + @SQL_Statement + ''',
'' + Value + '',
   (SELECT ' +
       @ColName + '
    FROM ' +
       @TableSchema + '.' + @TableName + '
    WHERE ' +
       @ColName + ' = ''' + CAST(@GuidArgument AS NVARCHAR(50)) + '
'')';

EXECUTE sp_executesql @SQL_String
PRINT @SQL_String;

我需要的是将此查询从 INSERT INTO ? VALUE 重写为 INSERT INTO ? SELECT 格式。

如果我没理解错的话,你想插入 SQL execute syntax string 结果是 ReturnTable table.

我会让子查询SQL执行保存在变量中的语法。因为这样会更清楚你需要做什么。

声明一个新变量 @SQL_excuteStatement 变量来保存您的执行语法。

@SQL_Statement 携带原始 SQL 字符串。

set @SQL_Statement =  'SELECT ' + @ColName + 
     ' FROM ' + @TableSchema + '.' + @TableName + 
     ' WHERE ' + @ColName + ' = '+'''''' +  CAST(@GuidArgument AS NVARCHAR(50)) + '''''';

并使用 select ... from table 而不是 select

中的子查询

有一个样品给你。

DECLARE @SQL_String NVARCHAR(MAX)
DECLARE @TableSchema NVARCHAR(MAX)
DECLARE @TableName NVARCHAR(MAX)
DECLARE @ColName NVARCHAR(MAX)
DECLARE @Counter int = 1
DECLARE @SQL_Statement NVARCHAR(MAX)
DECLARE @GuidArgument INT = 1

CREATE TABLE TableNames(
     ID INT,
     TableSchema NVARCHAR(100),
     TableName NVARCHAR(100),
     ColName  NVARCHAR(100)
);


CREATE TABLE ReturnTable(
     TableName NVARCHAR(100),
     ColName  NVARCHAR(100),
     SQL_Statement NVARCHAR(max),
     value nvarchar(max)
);


INSERT INTO TableNames VALUES (1,'dbo','T','val');

CREATE TABLE T(val INT);
INSERT INTO T VALUES (1)

SELECT @TableSchema = TableSchema FROM TableNames WHERE Id = @Counter;
SELECT @TableName = TableName FROM TableNames WHERE Id = @Counter;
SELECT @ColName = ColName FROM TableNames WHERE Id = @Counter;


set @SQL_Statement =  'SELECT ' + @ColName + 
 ' FROM ' + @TableSchema + '.' + @TableName + 
 ' WHERE ' + @ColName + ' = '+ '''''' +  CAST(@GuidArgument AS NVARCHAR(50)) + '''''';


SET @SQL_String =  N'INSERT INTO ReturnTable (TableName,ColName,SQL_Statement,value) 
SELECT '''+ @TableName + ''','''+ @ColName + ''','''+ @SQL_Statement + '''' + ',' + QUOTENAME(@ColName) +
' FROM ' + QUOTENAME(@TableSchema) + '.' + QUOTENAME(@TableName) + '' +
' WHERE ' + @ColName + ' = ''' +  CAST(@GuidArgument AS NVARCHAR(50)) + '''';

EXECUTE sp_executesql @SQL_String

sqlfiddle

备注

我建议您在 insert into

之后使用清除列
INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition;