2017-07-07 33 views
1

我想将动态SQL的结果输出到名为@Count的变量中,但不确定语法甚至代码应该如何完成此操作。将查询动态SQL输出到变量

的代码如下:

declare @tab nvarchar(255) = 'Person.person' 

declare @Count int 
declare @SQL nvarchar(max) = 'select count(*) from '+ @tab 


exec(@SQl) 


select @Count 

谢谢

+0

为什么要使用动态SQL这个... – scsimon

+0

我会避免使用动态SQL,除非你完全无法避免它。你最终没有自动完成,整体而言,它更容易出错。 – user2366842

+0

另外,还有SQL注入问题。这是一个你不应该忽视的大问题。 – RBarryYoung

回答

1

您可以利用sp_executesql执行您的计数()查询,并输出@count。

试试这个:

-- Set the table to count from 
declare @tab nvarchar(255) = 'Person.person' 

-- Assign the SQL query 
declare @SQL nvarchar(255) = N'SELECT count(*) FROM ' + @tab 

-- Pepare for sp_executesql 
declare @Count int 
declare @Params nvarchar(100) = N'@Count int output' 

-- Set the count to @Count 
exec sp_executesql @SQL, @Params, @[email protected] output 

-- Output @Count 
select @Count 

最后一件事:Person.person看起来像你可能试图从Person表引用一个人列。但是,上面的查询是一个文字表示,它看起来像你试图在你的问题中实现的。

+1

嗯。你真的尝试过吗? –

+1

动态SQL上下文无法在外部上下文中查看或修改变量。 – RBarryYoung

+0

伟大的一点;关于变量范围的想法并没有超出我的想法。 @Jesse刚刚发布了一个我在这里要提到的答案。我将很快修改这个以使用sp_executeSql。 – RToyo

1

下面的问题与你在这里提出的问题非常相似。

sp_executeSql with output parameter

DECLARE @retval int 
DECLARE @sSQL nvarchar(500); 
DECLARE @ParmDefinition nvarchar(500); 

DECLARE @tablename nvarchar(50) 
SELECT @tablename = N'products' 

SELECT @sSQL = N'SELECT @retvalOUT = MAX(ID) FROM ' + @tablename; 
SET @ParmDefinition = N'@retvalOUT int OUTPUT'; 

EXEC sp_executesql @sSQL, @ParmDefinition, @[email protected] OUTPUT; 

SELECT @retval; 
+0

谢谢杰西,那工作 – abs786123

3

这里的另一种方式做到这一点也安全地解决了SQL注入isuues:

/* Counts the number of rows from any non-system Table, *SAFELY* */ 

-- The table name passed 
DECLARE @PassedTableName as NVarchar(255) = 'Person.Person'; 

-- Make sure this isn't a SQL Injection attempt 
DECLARE @ActualTableName AS NVarchar(255) 

SELECT @ActualTableName = TABLE_SCHEMA + '.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME = PARSENAME(@PassedTableName,1) 
    AND TABLE_SCHEMA = PARSENAME(@PassedTableName,2) 

-- make a temp table to hold the results 
CREATE TABLE #tmp(cnt INT); 

-- create the dynamic SQL 
DECLARE @sql AS NVARCHAR(MAX) 
SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';' 

-- execute it and store the output into the temp table 
INSERT INTO #tmp(cnt) 
EXEC(@SQL); 

-- Now, finally, we can get it into a local variable 
DECLARE @result AS INT; 
SELECT @result = cnt FROM #tmp; 
+0

我无法测试这个,但是您确定可以将exec的结果插入另一个表中吗?我在Sybase上进行了测试(最近我必须使用SQLServer),并且不能将动态sql结果插入到表中。 – RToyo

+0

@RobbieToyota是的,我确定。我一直这样做,再加上我在发布之前测试了代码。 – RBarryYoung

+1

谢谢,我今天学到了一些新东西。 :) – RToyo