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'
我一直收到错误:' ='附近的语法不正确
答案 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)