0

次のスクリプトは、動的に生成された SQL ステートメントを取得して実行することを目的としています。スクリプトは実行されますが、意図した結果ではなく、動的 SQL 文字列のテキストが返されます。生成された文字列は、実行する必要がある文字列ですが、32 回呼び出されます (奇妙な数です。なぜそうなるのかわかりません)。これが動的に生成された SQL ステートメントの結果セットを返すだけではない理由がわかる人はいますか? SQL Server 2008 R2

記録として、SQL Server はクエリを 32 の異なる select ステートメントとして解釈し、それぞれが独自の行に配置されています。

返される文字列

SELECT DISTINCT x.patid 
FROM   (SELECT ic.patid 
        FROM   icdclm AS ic 
        WHERE  ic.icd LIKE '123%') AS x1 
       INNER JOIN (SELECT ic.patid 
                   FROM   icdclm AS ic 
                   WHERE  ic.icd LIKE '456%') x2 
               ON x2.patid = x1.patid 
       INNER JOIN (SELECT ic.patid 
                   FROM   icdclm AS ic 
                   WHERE  ic.icd LIKE '456%') x3 
               ON x3.patid = x1.patid 
       INNER JOIN (SELECT ic.patid 
                   FROM   icdclm AS ic 
                   WHERE  ic.icd LIKE '456%') x4 
               ON x4.patid = x1.patid 
       INNER JOIN (SELECT ic.patid 
                   FROM   icdclm AS ic 
                   WHERE  ic.icd LIKE '456%') x5 
               ON x5.patid = x1.patid 

そのSQLを実行する代わりに上記の文字列を生成する私のコード:

ALTER PROC Getmultiplecomorbidquery (@sqlquery NVARCHAR(1000) output) 
AS 
    DECLARE @x   INT, 
            @y   INT, 
            @sql NVARCHAR(1000) 

    SELECT @x = 1, 
           @y = 5, 
           @sql = 'select distinct x.patid from ( select ic.patid from icdClm as ic where ic.icd like ''123%'' ) as  x' + Cast(@x AS CHAR(1)) 

    WHILE @x < @y 
      BEGIN; 
          SET @sql=@sql + '  inner join  ( select ic.patid from icdClm as ic where ic.icd like ''456%'' ) x' + Cast(@x+1 AS CHAR(1)) + ' on x' 
                   + Cast(@x+1 AS CHAR(1)) 
                   + '.patid=x1.patid' 
          SET @x=@x + 1 
      END; 

    SET @sqlquery = @sql 

    SELECT @sql 
code i used to call
    DECLARE @sqlquery NVARCHAR(1000) 

    SET @sqlquery='' 

    EXECUTE dbo.Getmultiplecomorbidquery 
      @sqlquery output 

    SELECT @sqlquery 
4

1 に答える 1

0

クエリを実行することはなく、クエリを返すだけです。そこにEXECUTE @sqlが必要です(または結果を実行します)。

于 2012-12-04T21:27:22.813 に答える