[英]SQL Server : Insert Values into a Table with one Dynamic Query, constants, etc
我有以下查询,该查询将一些值插入到一个表中,并且此方法有效:
INSERT INTO Table(id, field_1, field_2, field_3, field_4)
SELECT (SELECT INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME + FORMAT(convert (datetime,date) , 'ddMMyyyy') +@MAINFIELD+@FIELDTYPE), @MAINFIELD, date , @ColumnName, '0'
FROM kat.[dbo].[Imported_Table]
INNER JOIN INFORMATION_SCHEMA.COLUMNS on INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = @TABLENAME and INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION = @CurrentPosition
一切正常。 当我想在表中插入一个新值并且该值是从动态查询中获得时,就会出现问题:
这是单独工作的查询(已定义变量)
EXEC ('SELECT '+@ColumnName+' from kat.[dbo].[Imported_Table]')
如果我想将其包括在插入查询中,那么我认为这是不可能的。 至少它不是为我编译的:
INSERT INTO Table(id, field_1, field_2, field_3, field_4, **field_5**)
SELECT (SELECT INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME + FORMAT(convert (datetime,date) , 'ddMMyyyy') +@MAINFIELD+@FIELDTYPE), @MAINFIELD, date , @ColumnName, '0', **EXEC ('SELECT '+@ColumnName+' from kat.[dbo].[Imported_Table]')**
FROM kat.[dbo].[Imported_Table]
INNER JOIN INFORMATION_SCHEMA.COLUMNS on INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = @TABLENAME and INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION = @CurrentPosition
也许有更好的解决方案将这个动态查询包含在insert子句中?
编辑:在Nisarg评论和支持后,我修改了查询:
set @MAINFIELD= CAST(@MAINCURRENCY AS VARCHAR);
set @FIELDTYPE= CAST(@RATETYPE AS VARCHAR);
SET @ColumnName = CAST(@ColumnName AS VARCHAR)
SET @CurrentPosition = CAST(@CurrentPosition AS INT)
EXEC( 'INSERT INTO Devisen_geldkurs(devisen_geldkurs, field_1, field_2, field_3, field_4, field_5)
SELECT (SELECT INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME + FORMAT(convert (datetime,date) , ''ddMMyyyy'') +''@MAINFIELD''+''@FIELDTYPE''), "@MAINFIELD", date , "@ColumnName", ''0'',
SELECT '+@ColumnName+' from kat.[dbo].[Imported_Table] from kat.[dbo].[Imported_Table]
INNER JOIN INFORMATION_SCHEMA.COLUMNS on INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = "Imported_Table" and INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION = ''@CurrentPosition''')
似乎唯一的问题是在SELECT子句中:
Incorrect syntax near the keyword 'SELECT'.
我还rom kat.[dbo].[Imported_Table] FROM kat.[dbo].[Imported_Table]
删除了以下内容之一: rom kat.[dbo].[Imported_Table] FROM kat.[dbo].[Imported_Table]
。 它被写了两次。
您不能只在查询中间编写动态查询。 但是您可以将整个查询转换为动态查询:
EXEC( 'INSERT INTO Table(id, field_1, field_2, field_3, field_4, field_5)
SELECT (SELECT INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME + FORMAT(convert (datetime,date) , ''ddMMyyyy'') +@MAINFIELD+@FIELDTYPE), @MAINFIELD, date , @ColumnName, ''0'',
SELECT '+@ColumnName+' from kat.[dbo].[Imported_Table] FROM kat.[dbo].[Imported_Table]
INNER JOIN INFORMATION_SCHEMA.COLUMNS on INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = @TABLENAME and INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION = @CurrentPosition')
不过,请先通过PRINT
进行检查,以确保查询没有任何语法错误。
另外,您应该避免使用EXEC
。 相反,您可以使用sp_executesql
,它为动态查询的SQL注入提供更好的保护。
我错过了将SELECT
子查询包装在方括号中的情况。 这应该是这样。 请注意(SELECT TOP 1 '+@ColumnName+' from kat.[dbo].[Imported_Table]) as field_5
的(SELECT TOP 1 '+@ColumnName+' from kat.[dbo].[Imported_Table]) as field_5
下面第7行中的(SELECT TOP 1 '+@ColumnName+' from kat.[dbo].[Imported_Table]) as field_5
语句:
set @MAINFIELD= CAST(@MAINCURRENCY AS VARCHAR);
set @FIELDTYPE= CAST(@RATETYPE AS VARCHAR);
SET @ColumnName = CAST(@ColumnName AS VARCHAR)
SET @CurrentPosition = CAST(@CurrentPosition AS INT)
EXEC( 'INSERT INTO Devisen_geldkurs(devisen_geldkurs, field_1, field_2, field_3, field_4, field_5)
SELECT (SELECT INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME + FORMAT(convert (datetime,date) , ''ddMMyyyy'') +''@MAINFIELD''+''@FIELDTYPE''), "@MAINFIELD", date , "@ColumnName", ''0'',
(SELECT TOP 1 '+@ColumnName+' from kat.[dbo].[Imported_Table]) as field_5
from kat.[dbo].[Imported_Table]
INNER JOIN INFORMATION_SCHEMA.COLUMNS on INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = "Imported_Table" and INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION = ''@CurrentPosition''')
另外,由于您使用的是动态查询,因此以下内容也应适用。 我删除了子查询,并在查询中附加了字段名称。
set @MAINFIELD= CAST(@MAINCURRENCY AS VARCHAR);
set @FIELDTYPE= CAST(@RATETYPE AS VARCHAR);
SET @ColumnName = CAST(@ColumnName AS VARCHAR)
SET @CurrentPosition = CAST(@CurrentPosition AS INT)
EXEC( 'INSERT INTO Devisen_geldkurs(devisen_geldkurs, field_1, field_2, field_3, field_4, field_5)
SELECT (SELECT INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME + FORMAT(convert (datetime,date) , ''ddMMyyyy'') +''@MAINFIELD''+''@FIELDTYPE''), "@MAINFIELD", date , "@ColumnName", ''0'', '+@ColumnName+'
from kat.[dbo].[Imported_Table]
INNER JOIN INFORMATION_SCHEMA.COLUMNS on INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = "Imported_Table" and INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION = ''@CurrentPosition''')
您可以使用INSERT EXEC。 您必须在动态查询的内部和外部声明表的变量。 在动态查询结束时,只需从表变量中选择并将结果集插入到外部表变量中
DECLARE @table SomeTable ( ID INT )
DECLARE @query NVARCHAR(120) = 'declare @table SomeTable (id int)
insert into @table values(1),(2)
select * from @table '
INSERT INTO @table
EXEC(@query)
SELECT * FROM @table
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.