2016-10-25 3 views
2

動的SQLを生成して関数の値を変数に代入しようとしています。私は動的SQLで関数から返された値を代入する

Select @[email protected]_Dept 
from dbo.WorkHistory(@today,@EID) 

関数は日付を返すようなSQLの何かを生成しようとしています、私は@StartDateに割り当てる必要があります(@EID_deptは、関数によって返される列の名前になります)。 @EID_Deptは@EIDと@deptを連結して生成されます。私は手動で私のコードは以下の通りです

Select @StartDate = amaan_IT 
from dbo.WorkHistory('2016-10-10', amaan) 

として、それが表示されますSQLを記述する場合

は:

DECLARE @EID varchar(5), @StartDate VARCHAR(MAX), 
     @today DATETIME, @dept VARCHAR(10), @EID_dept varchar(20); 

Select @today = SYSDATETIME() 
Select @dept = dept from dbo.Dept(@EID) 
Select @EID_Dept = CONCAT(@EID, @dept) 

DECLARE @SQL Varchar(max); 
SET @SQL = N'Select @StartDate = @EID_Dept 
      from dbo.PeriodHistory(@today, @EID)'; 

EXEC Sp_executesql 
    @SQL, 
    N'@StartDate VARCHAR(MAX) out,@EID_dept varchar(max),@today datetime,@EID Varchar', 
    @StartDate out, 
    @[email protected]_Dept, 
    @[email protected] 
+4

なぜ動的SQLをまったく使用していますか?これをもっと難しくする以外は何もしません。 –

+0

変数を使用してオブジェクト名を割り当てることはできません。SET @SQL = CONCAT(N'SELECT @StartDate = '、@EID_Dept、FROM dbo.PeriodHistory(@Today、@EID);)を使用する必要があります。しかしこれは理想からは遠く離れているようですが、あなたがこれを最善の方法でやっているとは確信していません。 – GarethD

+0

EIDが変更され、関数からデータを取得するためにEID n Deptを連結する必要があります。ちょうどEIDが渡され、EIDを使ってDeptを見つけて両方を連結する必要があります。 –

答えて

1

は、私はあなたのクエリを少し変更しました。これが正常に動作しますホープ:

DECLARE @EID nvarchar(5), 
     @StartDate nvarchar(MAX), 
     @today datetime = SYSDATETIME(), 
     @dept nvarchar(10), 
     @EID_dept nvarchar(20), 
     @SQL nvarchar(max), 
     @params nvarchar(max) = N'@StartDate nvarchar(MAX) out, @today datetime, @EID nvarchar(5)' 

Select @dept = dept from dbo.Dept(@EID) 
Select @EID_Dept = CONCAT(@EID, @dept) 

SET @SQL = N'Select @StartDate = ' + QUOTENAME(@EID_dept) + ' from dbo.PeriodHistory(@today, @EID);'; 

EXEC sp_executesql @SQL, 
        @params, 
        @StartDate = @StartDate out, 
        @today = @today, 
        @EID = @EID 

SELECT @StartDate 

私は(あなたがvarcharを使用しますが、変数に割り当てるN値を追加している)@SQLためnvarchar(max)を使用。 sp_executesql

は、Transact-SQLステートメントまたはバッチが含まれているUnicode文字列ですnvarchar一部声明でお待ちしています。

すべてのパラメータを@params変数に入れました。

@EID_deptに基づいて別の列を取得する必要があることがわかったので、QUOTENAMEを追加してこの変数をSQLステートメントビルディングに直接使用しました。変数として列名を送信することはできません。

関連する問題