次のスクリプトは、動的に生成された 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