2016-04-10 24 views
1

これは私が答えを見つけることができないより多くの質問です。SQL Serverのプロシージャ:動的SQL内の結果を選択

動的SQLでストアドプロシージャを使用していて、動的SQL内のテーブルから結果を選択した場合、プロシージャを実行すると、選択結果が表示されません。しかし、私は動的SQLの外で選択し、プロシージャを実行すると、私はテーブルの結果を参照してください。

メモ:動的SQL内で作成されるテーブルは、ローカル一時テーブルです。もちろんいつですか

これには理由がありますか?

IE

USE SERVER 
GO 
CREATE PROC AnalyticsDW.ComputeBestTreatment 
(
@ClientCode varchar(7)='FR' 
) 
as 


declare @sql varchar(1000) 
set @sql=' 
Bunch of code insert into #tableX 
select * from #tableX' 
EXEC (@SQL) 
RETURN 
go 

exec AnalyticsDW.ComputeBestTreatment 

手順を実行するときに結果が示すエラーがないにもかかわらず、表示されません。

USE SERVER 
    GO 
    CREATE PROC AnalyticsDW.ComputeBestTreatment 
    (
    @ClientCode varchar(7)='FR' 
    ) 
    as 

declare @sql varchar(1000) 
set @sql='Bunch of code insert into ##tableX' 
EXEC(@SQL) 
select * from ##tableX 
RETURN 
go 

exec AnalyticsDW.ComputeBestTreatment 
+0

AnalyticsDW.ComputeBestTreatmentをドロップし、それを呼び出すよりも、なぜ – Dejan

+0

申し訳ありませんが、私は最初を完全にコピーしていなかったことに気付きました。 procを作成するためだけに編集されています。 –

+0

私は答えを変更しました – Dejan

答えて

0

この

CREATE PROC dbo.spComputeBestTreatment 
(
    @ClientCode varchar(7)='FR' 
) 
    as 
begin 



    declare 
    @createTable as nvarchar(4000), 
    @tb as varchar(261); 

    set @tb = '##tt'; 
    set @createTable = ' create table '+ @tb + ' (id int,Name varchar(20)) ' 

    EXEC(@createTable); 

    declare @Insert varchar(1000) 
    set @Insert='insert into '+ @tb + ' values (1,''FirstName'') '; 

    EXEC(@Insert) 
    ; 
    declare @Select varchar(1000) 
    set @Select='SELECT * FROM '+ @tb 
    EXEC(@Select); 

    end 
    go 

exec dbo.spComputeBestTreatment 
+0

この例のようにグローバルな一時テーブルを使用すると動作します...(動的SQLの外で呼び出すと問題が発生します)問題はダイナミック内部で作成されたローカルの一時テーブルの結果を表示することですSQL。 –

0

を試してみて、私は少し、実際のデータを挿入するようにコードを変更しました。これは結果を返します:

CREATE PROC ComputeBestTreatment 
(
@ClientCode varchar(7)='FR' 
) 
as 


declare @sql varchar(1000) 
set @sql=' 
create table #tableX(i int) 
insert into #tableX (i) values(1) 
insert into #tableX (i) values(2) 
select * from #tableX' 
EXEC (@SQL) 
RETURN 
go 
EXEC ComputeBestTreatment 

実際のSPの動的SQLが実際に#tableXにデータを挿入していることは確かですか?

+0

そうです、最後のselect *を#tableに調整して* into ## tableを選択すると、procを実行すると結果が表示されます。だから私はそれをもう少し詳しく調べなければならない。助けてくれてありがとう –

+0

私が掲示したコードは結果セットを返し、ローカルの一時テーブル#tableXを使用することを意味しました。 – user212514

+0

私はこの事例を見ました。それは私のことをもっと混乱させます。 –

関連する問題