2014-11-14 45 views
0

我试图运行下面的动态SQL语句:返回行计数使用动态SQL

@Tbl,@Fld和@LookupValue已全部按表搜索,字段(或列)设为搜索和列值进行比较。

DECLARE @Sql AS VARCHAR(500) 
SET @Sql = 'SELECT COUNT(*) 
      FROM ' + @Tbl + 
      ' WITH (NOLOCK) 
      WHERE ' + @Fld + ' = ''' + @LookupValue + '''' 

EXEC(@Sql) 

我想将结果存储到一个变量,所以我可以检查是否有任何返回的行。该语句位于正在检查多个表和字段的WHILE构造中。

如果找到了记录,那么我想显示:

SET @Sql = 'SELECT ' + @Fld + 
      ' FROM ' + @Tbl + 
      ' WITH (NOLOCK) 
      WHERE ' + @Fld + ' = ''' + @LookupValue + '''' 

EXEC(@Sql) 
+0

你需要使用临时表来存储计数值 – radar 2014-11-14 18:50:44

+0

@RADAR,已经是SQL Server的,因为有MySQL中没有'NOLOCK'表提示。 – Rahul 2014-11-14 18:51:52

+0

@Rahul,你是对的。 – radar 2014-11-14 18:54:55

回答

0

您可以创建临时表和存储的计数值。

if object_id('tempdb.#mycount') is null 
create table #mycount (countVal int); 

DECLARE @Sql AS VARCHAR(500) 
SET @Sql = 'INSERT INTO #mycount 
      SELECT COUNT(*) 
      FROM ' + @Tbl + 
      ' WITH (NOLOCK) 
      WHERE ' + @Fld + ' = ''' + @LookupValue + '''' 

EXEC(@Sql) 

select countVal from #mycount 


-- once the temp table usage is done, you can delete it 
drop table #mycount 
1

是的,你可以将其存储在一个类型的变量,并使用sp_executesql

DECLARE @Sql AS NVARCHAR(500); 
DECLARE @cnt INT; 

SET @Sql = 'SELECT @cnt = COUNT(*) 
      FROM ' + @Tbl + 
      ' WITH (NOLOCK) 
      WHERE ' + @Fld + ' = ''' + @LookupValue + ''''; 

EXEC sp_executesql @Sql, N'@var INT OUTPUT', @var OUTPUT; 

SELECT @var;