我正在尝试使用变量将数据插入到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'附近的语法不正确。
答案 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'
答案 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)