【问题标题】:Dynamic SQL Output variable动态 SQL 输出变量
【发布时间】:2014-06-02 02:08:14
【问题描述】:

请看下面的SQL代码:

declare @Classification as varchar(5)
set @Classification =''
declare @ClassificationSQL as nvarchar(4000)
set @ClassificationSQL=''

declare @cnt int
declare @counts int

DECLARE NicheDeletionOffenderCursor CURSOR FOR  
    select classification from dbnicheoffenderclassificationlookup
    Open NicheDeletionOffenderCursor
    FETCH NEXT FROM NicheDeletionOffenderCursor INTO @Classification

    WHILE @@FETCH_STATUS = 0 
    BEGIN
    If @ClassificationSQL=''
        set @ClassificationSQL='classification like ' + char(39) + '%' + @Classification + '%' + char(39)
    else
        set @ClassificationSQL=@ClassificationSQL + ' OR classification like ' + char(39) + '%' + @Classification + '%' + char(39)
    FETCH NEXT FROM NicheDeletionOffenderCursor INTO @Classification
    END
CLOSE NicheDeletionOffenderCursor 
DEALLOCATE NicheDeletionOffenderCursor 

SET @ClassificationSQL = 'select count(*) as cnt from person where id=903 and (' + @ClassificationSQL + ')' 

EXECUTE sp_executesql @ClassificationSQL, N'@cnt int OUTPUT', @cnt=@Counts OUTPUT

如何将 @ClassificationSQL 的计数输出分配给一个变量以在 TSQL 的下一部分中使用?

【问题讨论】:

  • 呃,SELECT @cnt = count(*) from person... 这里有各种各样的问题。为什么不dbo.person?为什么是@cnt@counts?为什么案件不同?为什么倒数第二行没有N前缀?
  • 我是动态 sql 的新手。我从以下问题中借用了一些代码:stackoverflow.com/questions/3840730/…。我可能完全错了。

标签: sql sql-server tsql


【解决方案1】:

请参阅以下示例,了解如何获取动态查询的输出(在 SQL Server 2008 R2 中测试)。实际发帖来自How to get sp_executesql result into a variable?

DECLARE @retval int;   
DECLARE @SQL nvarchar(500);
DECLARE @Param nvarchar(500);

DECLARE @table nvarchar(50)  
SELECT @table = N'newperson'  

SELECT @SQL = N'SELECT @retvalOUT = MAX(salary) FROM ' + @table;  
SET @Param = N'@retvalOUT int OUTPUT';

EXEC sp_executesql @SQL, @Param, @retvalOUT=@retval OUTPUT;

SELECT @retval;

您可以相应地更改您的程序。

【讨论】:

    【解决方案2】:

    这里有几件事要提:

    1. 无需在外部(即顶部)声明动态sql内部使用的变量(即@cnt
    2. 不需要游标,因为简单的 SELECT @var = @var + column 构造会连接
    3. 没有游标,就不需要声明它使用的变量(即@Classification
    4. 可以使用其中的两个来转义单引号(即'')。但是,可能只是更喜欢使用CHAR(39),因为有些人认为它更具可读性。
    5. 在动态 SQL 中设置变量就像常规 SQL(即SELECT @var = expression FROM...

    最终结果:

    DECLARE @ClassificationSQL NVARCHAR(4000)
    DECLARE @Counts INT
    
    SET @ClassificationSQL = COALESCE(@ClassificationSQL + N' OR ', '')
                                + N'classification LIKE ''%'
                                + classification
                                + N'%'''
    FROM dbnicheoffenderclassificationlookup
    
    SET @ClassificationSQL =
          N'SELECT @TempCount = COUNT(*) FROM person WHERE id = 903 AND ('
        + @ClassificationSQL
        + N')'
    
    EXECUTE sp_executesql
        @ClassificationSQL,
        N'@TempCount INT OUTPUT',
        @TempCount = @Counts OUTPUT
    
    SELECT @Counts
    

    【讨论】:

      猜你喜欢
      • 2017-12-12
      • 2013-09-27
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      相关资源
      最近更新 更多