动态 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
备注
我建议您在 insert into
之后使用清除列
INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition;
我想问一下如何通过动态 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
备注
我建议您在 insert into
INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition;