繁体   English   中英

SQL Server:使用一个动态查询,常量等将值插入表中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM