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

时间:2015-08-20 15:40:07

标签: sql sql-server sql-server-2008 dynamic

我试图将动态查询存储在SQL Server中的IF EXISTS条件

create procedure temp_order
(
@tbl varchar (max)
)
as
begin
IF EXISTS ('SELECT * FROM ' + @tbl + ' where cd = 1')
end

但看起来动态查询不会在内部工作" IF EXISTS"条件, 如果表格存在与否,是否有任何形成条件的方法?

2 个答案:

答案 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