0

SQL Server プロシージャがあり、ファイル名をパラメーターとして使用したいと考えています。

私のコードは次のとおりです。

CREATE PROCEDURE XMLTOSQLTABLE1 @NewName nvarchar(50)
AS
  TRUNCATE TABLE [dbo.Student]

  DECLARE @x XML
  SELECT @x = P
  FROM OPENROWSET (BULK @NewName, SINGLE_BLOB) AS Student(P)

  DECLARE @hdoc int

  EXEC sp_xml_preparedocument 
    @hdoc OUTPUT, 
    @x

  INSERT INTO [dbo.Student] 
  SELECT * 
  FROM OPENXML (@hdoc, '/class_list/student',2)
  WITH (
    name varchar(100), 
    grade varchar(100))

  EXEC sp_xml_removedocument @hdoc
GO

ファイル名と列名をパラメーターとして使用したいので、ファイル名と列名をパラメーターとして使用してプロシージャーを実行するだけで、任意の XML ファイルをデータベースに簡単に入力できます。

4

1 に答える 1

1

コードに関する限り、それが機能するためにいくつかのことに注意を払う必要があります。

どれどれ:

  1. TRUNCATE TABLE [dbo.Student]

    デフォルトのスキーマでテーブル Student を切り捨てていると思います。だから、そうあるべきです

    TRUNCATE TABLE Student
    

    また

    TRUNCATE TABLE dbo.Student
    

    テーブル名に特別な文字やキーワードがないため、角括弧を忘れてください。

  2. SELECT @x = P FROM OPENROWSET (BULK @NewName, SINGLE_BLOB) AS Student(P)

    OPENROWSET BULKファイルの読み取りをパラメーター化することはできません。これを行う唯一の方法は、動的 SQL を使用することです。これを参照してください

    もう 1 つの問題は、varbinary BLOB を xml 変数に割り当てることです。これは、CAST(P as xml). ここで適切にフォーマットされていない XML セグメントがエラーをスローするため、実際にロードしているものに注意してください。

  3. 別の問題は、sp_xml_preparedocumentプロシージャの使用です。本当に必要ですか?この種の XML 解析を使用すると、xml リソースが制限される可能性があります。また、呼び出すのを忘れた場合 (またはエラーのためにスキップしたsp_xml_removedocument場合)、これが原因でエラーが発生します。私の知る限り、サーバーの再起動がここで役立ちます。

    注: sp_xml_preparedocument は脆弱であるため、XML ファイルのソースに注意してください。

これをクリアすると、いくつかの質問が未解決のままになります: どのような種類の 2 番目のパラメーター (列名) が必要で、その理由は何ですか? XML パラメータにする必要がありますか? 一括ロードされた xml ルートからどのような子を抽出する必要があるかをヒントとして使用する必要がありますか?

これを整理すると、ストアド プロシージャを構築できると思いますが、動的な式がなければ構築できません。

于 2013-07-18T21:57:29.097 に答える