我想将动态SQL的结果输出到名为@Count的变量中,但不确定语法甚至代码应该如何完成此操作。将查询动态SQL输出到变量
的代码如下:
declare @tab nvarchar(255) = 'Person.person'
declare @Count int
declare @SQL nvarchar(max) = 'select count(*) from '+ @tab
exec(@SQl)
select @Count
谢谢
我想将动态SQL的结果输出到名为@Count的变量中,但不确定语法甚至代码应该如何完成此操作。将查询动态SQL输出到变量
的代码如下:
declare @tab nvarchar(255) = 'Person.person'
declare @Count int
declare @SQL nvarchar(max) = 'select count(*) from '+ @tab
exec(@SQl)
select @Count
谢谢
您可以利用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表引用一个人列。但是,上面的查询是一个文字表示,它看起来像你试图在你的问题中实现的。
嗯。你真的尝试过吗? –
动态SQL上下文无法在外部上下文中查看或修改变量。 – RBarryYoung
伟大的一点;关于变量范围的想法并没有超出我的想法。 @Jesse刚刚发布了一个我在这里要提到的答案。我将很快修改这个以使用sp_executeSql。 – RToyo
下面的问题与你在这里提出的问题非常相似。
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;
谢谢杰西,那工作 – abs786123
这里的另一种方式做到这一点也安全地解决了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;
我无法测试这个,但是您确定可以将exec的结果插入另一个表中吗?我在Sybase上进行了测试(最近我必须使用SQLServer),并且不能将动态sql结果插入到表中。 – RToyo
@RobbieToyota是的,我确定。我一直这样做,再加上我在发布之前测试了代码。 – RBarryYoung
谢谢,我今天学到了一些新东西。 :) – RToyo
为什么要使用动态SQL这个... – scsimon
我会避免使用动态SQL,除非你完全无法避免它。你最终没有自动完成,整体而言,它更容易出错。 – user2366842
另外,还有SQL注入问题。这是一个你不应该忽视的大问题。 – RBarryYoung