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

时间:2014-08-22 15:51:37

标签: 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','F6BFBA52-B898-4246-9F58-001DFBDA32ED'

我一直收到错误:' ='附近的语法不正确

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

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

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

ALTER PROCEDURE TEST
(
    @table SYSNAME,
    @id uniqueidentifier
)
AS
BEGIN
  SET NOCOUNT ON;
    declare @sql nvarchar(max);

    set @sql = N'select * from ' + QUOTENAME(@table) + N' where [ID] = @id';

    EXECUTE sp_executesql @sql
                         ,N'@id uniqueidentifier'
                         ,@id
END

答案 2 :(得分:0)

你可以尝试一下 -

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)