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字符串文字