Sql server 靠近'的语法不正确=';在sql server中将uniqueidentifier作为参数传递时

Sql server 靠近'的语法不正确=';在sql server中将uniqueidentifier作为参数传递时,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我如何测试它: alter PROCEDURE TEST( @table nvarchar(50), @id uniqueidentifier ) AS declare @sql nvarchar(max) set @sql = 'select * from ' + @table + 'where ID = ' + CAST(@id as nvarchar(36)); exec (@sql) 我经常遇到错误:“=”附近的语法不正确。你能试试这个吗- EXEC TEST 'testable',

我如何测试它:

alter PROCEDURE TEST(
@table nvarchar(50),
@id uniqueidentifier
)
AS
declare @sql nvarchar(max)

set @sql = 'select * from ' + @table + 'where ID = ' + CAST(@id as nvarchar(36));
exec (@sql)
我经常遇到错误:“=”附近的语法不正确。

你能试试这个吗-

EXEC TEST 'testable','F6BFBA52-B898-4246-9F58-001DFBDA32ED'
你能试试这个吗-

EXEC TEST 'testable','F6BFBA52-B898-4246-9F58-001DFBDA32ED'

假设您了解动态生成这样的SQL的危险,那么您生成的SQL中缺少空格和单引号:

alter PROCEDURE TEST(
   @table nvarchar(50),
   @id uniqueidentifier
)
AS
   declare @sql nvarchar(max)

   set @sql = N'select * from ' + @table + 'where ID = ' + char(39) + CAST(@id as nvarchar(38)) + char(39);
   exec (@sql)

假设您了解动态生成这样的SQL的危险,那么您生成的SQL中缺少空格和单引号:

alter PROCEDURE TEST(
   @table nvarchar(50),
   @id uniqueidentifier
)
AS
   declare @sql nvarchar(max)

   set @sql = N'select * from ' + @table + 'where ID = ' + char(39) + CAST(@id as nvarchar(38)) + char(39);
   exec (@sql)

使用动态sql时,请使用系统存储过程
sp_executesql

对sql server对象(表、列)参数使用
SYSNAME
数据类型

当期望最终用户提供对象名称时,最终会将它们连接起来,在它们周围使用
QUOTENAME()
函数参数,该参数在这些连接的参数周围强制使用方括号
[]
,并强制sql server将这些参数视为sql server对象名称,以防止sql注入攻击

set @sql = N'select * from ' + @table + N' where ID = N''' + CAST(@id as nvarchar(36)) + N'''';
--                                        ^             ^^                                 ^^

使用动态sql时,请使用系统存储过程
sp_executesql

对sql server对象(表、列)参数使用
SYSNAME
数据类型

当期望最终用户提供对象名称时,最终会将它们连接起来,在它们周围使用
QUOTENAME()
函数参数,该参数在这些连接的参数周围强制使用方括号
[]
,并强制sql server将这些参数视为sql server对象名称,以防止sql注入攻击

set @sql = N'select * from ' + @table + N' where ID = N''' + CAST(@id as nvarchar(36)) + N'''';
--                                        ^             ^^                                 ^^

您在
where
之前缺少一个空格,因此表名“粘”在关键字上:
'where ID=
…在这里要非常小心…您的过程极易受到sql注入的攻击。@dasblinkenligh,我添加了空格,现在它告诉我“F58”附近的语法不正确。调试动态sql的最佳方法不是执行它。您应该首先选择或打印@sql来检查动态sql的内容。如果您使用
nvarchar
,您应该始终使用带有前导
N
前缀的
N'..
符号来指示Unicode字符串文字您在
where
之前缺少一个空格,因此表名是“粘合”的关键字:
'where ID=
…在这里要非常小心…您的过程极易受到sql注入的攻击。@dasblinkenlight,我添加了空格,现在它告诉我“F58”附近的语法不正确。调试动态sql的最佳方法不是执行它。您应该先选择或打印@sql来检查动态sql的内容。如果您使用
nvarchar
,则应始终使用带有前导
N
前缀的
N'..
符号来指示Unicode字符串文字如果您使用
nvarchar
,您应该始终使用带有前导
N
前缀的
N'....
表示法来表示Unicode字符串文字如果您使用
nvarchar
,您应该始终使用带有前导
N
前缀的
N'..
表示法来表示Unicode字符串文字如果您使用
nvarchar
,您应该始终使用带有前导
N
前缀的
N'..'
符号来指示Unicode字符串文字如果您使用
nvarchar
,您应该始终使用带有前导
N
前缀的
N'..'
符号来指示Unicode字符串文字