SQL Server:如何使用变量插入

时间:2018-01-16 07:16:16

标签: sql sql-server

我正在尝试使用变量将数据插入到SQL Server表中。我试过了

DECLARE @table NVARCHAR(50) = 'ToolList',
        @val NVARCHAR(50) = 'test'

EXEC ('INSERT INTO ' + @table + 'SELECT ' + @val)

EXEC ('INSERT INTO ' + @table + '([col1]) VALUES(' + @val +')' 

但仍然会收到错误消息

  

' test'附近的语法不正确。

4 个答案:

答案 0 :(得分:4)

您错过了SELECT之前的空格,而@val应该包含在单引号

DECLARE @table nvarchar(50) = 'ToolList',
    @val nvarchar(50) = 'test'


EXEC ( 'INSERT INTO ' + @table + ' SELECT ''' + @val + '''')

当您使用Dynamic SQL时,更容易在变量中形成查询,以便您可以打印出来,在执行前检查值

select @sql = 'INSERT INTO ' + @table + ' SELECT ''' + @val + ''''
print  @sql
exec  (@sql)

答案 1 :(得分:2)

您最好使用允许参数化语句的sp_executesql,以避免SQL注入的风险。

DECLARE @Query NVARCHAR(1000),
    @table NVARCHAR(50) = 'ToolList'

SET @Query = 'INSERT INTO ' + @table + ' SELECT @val'
EXEC sp_executesql @Query, N'@val nvarchar(50)', @val = 'test'

sp-executesql-transact-sql

答案 2 :(得分:1)

您还可以使用 CHAR(39) ,而不是每次都添加单引号,以提高可读性。而且,您还没有在包含表名的变量之后添加空格。

<强>查询

declare @table nvarchar(50) = 'ToolList',
        @val nvarchar(50) = 'test2';

 declare @sql as varchar(max) = 'insert into ' + @table 
                             + ' select ' + char(39) +  @val + char(39);
exec(@sql);

答案 3 :(得分:1)

在@val字段之前需要4个单引号,因为它是一个字符串,所有字符串都需要封装在单引号中。 您可以使用PRINT命令打印动态字符串,检查您要执行的最终字符串。

DECLARE @table VARCHAR(50) = 'ToolList'
DECLARE @val VARCHAR(50) = 'test'
DECLARE @DSQL AS VARCHAR(MAX) = ''

SET @DSQL = @DSQL + ' INSERT INTO [' + @table + ']' + ' 
 SELECT ' + '''' + @val + ''''

--PRINT @DSQL
EXEC(@DSQL)