我尝试将动态查询存储在SQL Server的IF EXISTS条件中
create procedure temp_order
(
@tbl varchar (max)
)
as
begin
IF EXISTS ('SELECT * FROM ' + @tbl + ' where cd = 1')
end
,但它看起来像动态查询不工作在"IF EXISTS"条件,有什么方法可以确定这些表是否存在?
您需要为此使用动态sql,但是使用动态sql与sp_executesql和quotename函数,如下所示,否则您的代码可能容易受到sql注入攻击。
create procedure temp_order
(
@tbl SYSNAME, --<-- use appropriate data type
@Exists INT OUTPUT
)
as
begin
Declare @Sql NVARCHAR(MAX);
SET @Sql = N'IF EXISTS( SELECT * FROM ' + QUOTENAME(@tbl)
+ N' where cd = 1)'
+ N'BEGIN
SET @Exists = 1;
END
ELSE
BEGIN
SET @Exists = 0;
END'
Exec sp_executesql @sql
,N'@Exists INT OUTPUT'
,@Exists OUTPUT
end
Try This:
DECLARE @I TABLE(I INT)
declare @sql varchar(1000) = 'select top(1) 1 from ' + @tbl + ' with(nolock) where cd = 1'
INSERT INTO @i EXEC (@sql)
IF EXISTS (select 1 from @i) Print 'exists' else print 'doesn''t exist'
如果这符合您的需要,那么根据参数的来源,查看要采取哪些"防御措施"来防止注射等。