在IF EXISTS条件中放置动态查询



我尝试将动态查询存储在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'

如果这符合您的需要,那么根据参数的来源,查看要采取哪些"防御措施"来防止注射等。

最新更新