2

必要な情報を返す以下のクエリがありますが、このクエリをスカラー値関数で使用して、計算列で返された値を使用する必要があります。

XML 列は同じテーブルにあり、Settings の値を Directions という名前の列に挿入する必要があります

;WITH XMLNAMESPACES ( 'http://www.w3.org/2001/XMLSchema' AS als )
SELECT
 a.a.value('@Settings', 'VARCHAR(50)') AS [Settings]

FROM Base AS X
    CROSS APPLY X.BaseXML.nodes('als:Name') a(a)

私が試していた関数はどこにも行きませんでした

CREATE FUNCTION [dbo].[ChooseRevision](@lineId int) Returns integer As
Begin
Return (WITH XMLNAMESPACES ( 'http://www.w3.org/2001/XMLSchema' AS als )
SELECT
 a.a.value('@Settings', 'VARCHAR(50)') AS [Settings]

FROM Base AS X
    CROSS APPLY X.BaseXML.nodes('als:Name') a(a)
Where LineId = @lideid
)
End

GO

計算列として使用するスカラー関数内にクエリをどのように含めますか?

<als:Doc xmlns:als="http://www.w3.org/2001/XMLSchema" SchemaVersion="0.1" Settings="First Test" Title="Recovery Loop">
  <als:Base Rev="0" Id="201" />
  <als:Number TimeStamp="2013-01-21T15:08:00">
    <als:Member Name="Club Run" DirId="123" />
  </als:Number>
  </als:Doc>
4

2 に答える 2

2

XML 値ごとに 1 つのノードしかないと仮定すると、次のようにals:Name記述できます。

CREATE FUNCTION [dbo].[ChooseRevision](@lineId int) 
RETURNS VARCHAR(50) 
AS
BEGIN
  DECLARE @r VARCHAR(50);
  WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema' AS als)
  SELECT
   @r = BaseXML.value('als:Doc[1]/@Settings', 'VARCHAR(50)') 
  FROM Base
  WHERE LineId = @lineId;
  RETURN @r;
END

この関数を dbo.Base テーブル自体で使用する予定がある場合は、代わりに次のバージョンを使用する必要があります。

CREATE FUNCTION [dbo].[ChooseRevision](@xml XML) 
RETURNS VARCHAR(50) 
AS
BEGIN
  DECLARE @r VARCHAR(50);
  WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema' AS als)
  SELECT @r = @xml.value('als:Doc[1]/@Settings', 'VARCHAR(50)') 
  RETURN @r;
END
于 2013-01-28T22:45:49.417 に答える
1

あなたがやろうとしていることの問題は、あなたが選択したクエリが1つの結果しか返さないことを知っているかもしれないが、データベースは返さないということです。このサンプルスキーマを検討してください

CREATE TABLE Base (BaseXML XML, Settings INT);
INSERT Base VALUES ('<root settings="1"><a>SomeXML</a></root>', NULL);

設定はルートに1回だけ表示されるので、これは

SELECT  a.a.value('@settings', 'VARCHAR(50)') AS [Settings]
FROM    Base X
        CROSS APPLY X.BaseXML.nodes('root') a(a);

ただし、このスキーマを使用した場合、(行ごとに)1つの結果のみが返されます。

CREATE TABLE Base2 (BaseXML XML, Settings INT);
INSERT Base2 VALUES ('<root><a settings="1">SomeXML</a><a settings="2">Some More XML</a></root>', NULL);

ほぼ同じクエリは2行を返します。

SELECT  a.a.value('@settings', 'VARCHAR(50)') AS [Settings]
FROM    Base2 X
        CROSS APPLY X.BaseXML.nodes('root/a') a(a);

したがって、関数はスカラー関数として機能できません。[1]を使用して、1つ(最初の)の値のみを期待していることをSQLに通知する必要があります。

SELECT  BaseXML.value('/root[1]/@settings[1]', 'INT') AS Settings
FROM    Base;

複数の戻り値を示すSQLフィドル

ただし、これを行うための最良の方法は、LineIDをパラメーターとして送信するのではなく、XML自体を送信することです。計算列が必要なため、XMLデータを送信して、テーブルの不要な2番目のクエリを保存できます。

CREATE FUNCTION dbo.ParseBaseSettings (@XML XML)
RETURNS INT
AS
BEGIN
    RETURN @XML.value('/root[1]/@settings[1]', 'INT');
END;

ここでXML名前空間を処理する必要があるかもしれませんが、たとえば、これをスキップしました。

最後に、計算列を作成できます。

CREATE TABLE Base 
(   BaseXML XML, 
    Settings AS dbo.ParseBaseSettings(BaseXML)
);

最終的な解決策のSQLフィドル

編集

実際のXMLデータを使用して、この関数をコンパイルしました。

CREATE FUNCTION dbo.ParseBaseSettings (@XML XML)
RETURNS NVARCHAR(50)
AS
BEGIN
    DECLARE @Ret NVARCHAR(50);        
    WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema' AS als)
    SELECT  @Ret = @XML.value('/als:Doc[1]/@Settings', 'NVARCHAR(50)');

    RETURN @Ret;
END;
于 2013-01-28T22:40:16.573 に答える