2016-05-04 6 views
1

XMLを返すSQL Server 2012でユーザー定義関数を作成しました。私は、SELECT文で関数を呼びたいと思います。これは可能ですか?私はそれをやってみたとき は、私はエラーを取得する:xmlデータを返すselectステートメントでユーザー定義関数を呼び出す

The FOR XML clause is not allowed in a ASSIGNMENT statement.

私はSELECT文はそのロジック内の他の名前のメソッドの依存関係を持つこれらの名前のメソッドのセットを返すようにしたいです。 メインのCTEでは、依存関係を持つメソッドの最新バージョンを取得します。 UDFは各メソッドのロジックを経て、その中で呼び出されたメソッドを返します。だから、私は、SELECTステートメントでUDFを呼び出し、依存するメソッド名のXMLを返したいと思います。

この関数は動作し、XMLデータを返します。これは関数です。

ALTER FUNCTION [dbo].[GetCalledMLMs] 
(
    -- Add the parameters for the function here 
    @MLM_Txt nvarchar(MAX) 
) 
RETURNS XML 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @CalledMLMs XML 
    Declare @MLMTbl table (pos int, endpos int, CalledMLM nvarchar(200)) 
    --Logic to get the data... 

    Select @CalledMLMs = CalledMLM from @MLMTbl FOR XML PATH 

    -- Return the result of the function 
    RETURN @CalledMLMs 

END 

これはUDFを呼び出すCTEです。

;with cte as 
(
select distinct Name, max(ID) as LatestVersion 
from MLM_T 
where Logic like '%:= MLM %' and Logic not like '%standard_libs := mlm%' 
group by Name 
) 
select MLM2.Name, LatestVersion, 
dbo.GetCalledMLMs(MLM2.Logic) as CalledMLMs 
from cte join MLM_T MLM2 on cte.Name = MLM2.Name 
    and cte.LatestVersion = MLM2.ID 
    and MLM2.Active = 1 and MLM2.Status in (3, 4) 

このクエリを実行すると、XMLが代入文で使用できないというエラーが表示されます。 XMLデータ型を返すSELECT文で関数を呼び出す方法はありますか?

答えて

0

あなたが値に変数を設定したい場合は、SETを使用する必要が中「から」句で関数を呼び出し

FUNCTION [dbo].[GetCalledMLMsTbl] 
(
    -- Add the parameters for the function here 
    @MLM_Txt nvarchar(MAX) 
) 
--RETURNS XML 
RETURNS @MLMTbl TABLE 
(
    pos int, 
    endpos int, 
    CalledMLM nvarchar(200) 
) 
AS 
BEGIN 
    --logic here 
    insert into @MLMTbl (pos, endpos, CalledMLM) Values (@startpos, @endpos, @MLM_name) 
RETURN 
END 

右側にはスカラー値があります。 XMLはSELECTの列が、を選択するプロセスの後に何かではないので

構文SELECT @SomeVariable=SomeColumn FROM SomeTableは、(...とにかく、かなり危険な)FOR XMLでは不可能です。

あなたの問題はここに位置しています:

Select @CalledMLMs = CalledMLM from @MLMTbl FOR XML PATH 

SET @CalledMLMs = (SELECT CalledMLM FROM @MLMTbl FRO XML PATH); 
1

私はこの問題を、XMLではなくテーブルを返すように変更して解決しました。 だから、それは次のようになります。その後、私は選択

;with cte as 
(
select distinct Name, max(ID) as LatestVersion 
from CV3MLM 
where Logic like '%:= MLM %' and Logic not like '%standard_libs := mlm%' 
    --and Name not like '%V61_CCC' 
group by Name 
) 
select MLM2.Name, LatestVersion, C.CalledMLM 
from cte join MLM_tbl MLM2 on cte.Name = MLM2.Name and cte.LatestVersion = MLM2.ID 
    and MLM2.Active = 1 and MLM2.Status in (3, 4) 
    cross apply dbo.GetCalledMLMsTbl(MLM2.Logic) C 
order by MLM2.Name, LatestVersion 
+0

にこれを変更しようと申し訳ありませんが、私は唯一の小切手1の答えを受け入れることができることを認識していませんでした。元の質問を解決したので、私はあなたのものを選択します。メモをありがとう。 –

関連する問題