将动态 SQL 的结果放入 sql-server 的变量中

Posted

技术标签:

【中文标题】将动态 SQL 的结果放入 sql-server 的变量中【英文标题】:Getting result of dynamic SQL into a variable for sql-server 【发布时间】:2011-04-19 22:28:51 【问题描述】:

在存储过程中执行动态SQL如下:

DECLARE @sqlCommand nvarchar(1000)
DECLARE @city varchar(75)
SET @city = 'London'
SET @sqlCommand = 'SELECT COUNT(*) FROM customers WHERE City = @city'
EXECUTE sp_executesql @sqlCommand, N'@city nvarchar(75)', @city = @city

如何在 SP 中使用 count(*) 列值作为返回值?

【问题讨论】:

【参考方案1】:
DECLARE @sqlCommand NVARCHAR(1000)
DECLARE @count INT
DECLARE @city VARCHAR(75)
SET @city = 'New York'

SET @sqlCommand = 'SELECT @cnt=COUNT(*) FROM customers WHERE City = @city'
EXECUTE sp_executesql @sqlCommand, N'@city nvarchar(75), @cnt int OUTPUT', @city = @city, @cnt = @count OUTPUT

SELECT @count

【讨论】:

+1:你打败了我,需要声明一个变量,并将其标记为输出。 For more info, and a recommended read for SQL Server dynamic SQL, see The curse and blessings of dynamic SQL 谢谢。 N'@city nvarchar(75),@cnt int OUTPUT' 中的 OUTPUT 关键字是我所缺少的。 有没有不需要在动态语句中添加输出变量的解决方案???【参考方案2】:

动态版本

    ALTER PROCEDURE [dbo].[ReseedTableIdentityCol](@p_table varchar(max))-- RETURNS int
    AS
    BEGIN
        -- Declare the return variable here
       DECLARE @sqlCommand nvarchar(1000)
       DECLARE @maxVal INT
       set @sqlCommand = 'SELECT @maxVal = ISNULL(max(ID),0)+1 from '+@p_table
       EXECUTE sp_executesql @sqlCommand, N'@maxVal int OUTPUT',@maxVal=@maxVal OUTPUT
       DBCC CHECKIDENT(@p_table, RESEED, @maxVal)
    END


exec dbo.ReseedTableIdentityCol @p_table='Junk'

【讨论】:

【参考方案3】:

您可能已经尝试过,但是您的规范是否可以做到这一点?

DECLARE @city varchar(75)
DECLARE @count INT
SET @city = 'London'
SELECT @count = COUNT(*) FROM customers WHERE City = @city

【讨论】:

【参考方案4】:

这可能是一个解决方案?

declare @step2cmd nvarchar(200)
DECLARE @rcount NUMERIC(18,0)   
set @step2cmd = 'select count(*) from uat.ap.ztscm_protocollo' --+ @nometab
EXECUTE @rcount=sp_executesql @step2cmd
select @rcount

【讨论】:

【参考方案5】:
DECLARE @sqlCommand nvarchar(1000)
DECLARE @city varchar(75)
DECLARE @cnt int
SET @city = 'London'
SET @sqlCommand = 'SELECT @cnt=COUNT(*) FROM customers WHERE City = @city'
EXECUTE sp_executesql @sqlCommand, N'@city nvarchar(75)', @city = @city
RETURN @cnt

【讨论】:

我认为你的答案被截断了。 消息 137,Must declare the scalar variable "@cnt". 消息 178,A RETURN statement with a return value cannot be used in this context.。一个不错的作品,兄弟))【参考方案6】:
 vMYQUERY := 'SELECT COUNT(*) FROM ALL_OBJECTS WHERE OWNER = UPPER(''MFI_IDBI2LIVE'') AND OBJECT_TYPE = ''TABLE'' 
    AND OBJECT_NAME  =''' || vTBL_CLIENT_MASTER || '''';
    PRINT_STRING(VMYQUERY);
    EXECUTE IMMEDIATE  vMYQUERY INTO VCOUNTTEMP ;

【讨论】:

这不适用于sql server。

以上是关于将动态 SQL 的结果放入 sql-server 的变量中的主要内容,如果未能解决你的问题,请参考以下文章

sql-server:“,”附近的语法不正确

sql-server--视图

SQL-Server 后端、MS Access 前端:连接

sql-server笔记-sql

sql-server笔记

将大型 XML 导入 SQL-Server 表的最快方法