我试图将动态查询存储在SQL Server中的IF EXISTS条件
中create procedure temp_order
(
@tbl varchar (max)
)
as
begin
IF EXISTS ('SELECT * FROM ' + @tbl + ' where cd = 1')
end
但看起来动态查询不会在内部工作" IF EXISTS"条件, 如果表格存在与否,是否有任何形成条件的方法?
答案 0 :(得分:0)
试试这个:
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'
如果这符合您的需要,那么根据参数的来源,看看采取什么样的“防御措施”来防止注射等。
答案 1 :(得分:0)
你需要使用动态sql,但是使用带有sp_executesql和quotename函数的动态sql,如下所示,否则你的代码可能容易发生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