2013-07-18 52 views
0

我有一個SQL Server過程,我希望將文件名作爲參數。將文件名作爲參數的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文件到數據庫和列名作爲我的參數。

+0

我不明白你想要做什麼,你想創建一個帶有兩個參數的存儲過程嗎? – 2013-07-18 20:54:30

回答

1

就您的代碼而言,您必須注意一些事情才能正常工作。

讓我們來看看:

  1. TRUNCATE TABLE [dbo.Student]

    我相信你在默認模式截斷表的學生。 所以,它應該是

    TRUNCATE TABLE Student 
    

    TRUNCATE TABLE dbo.Student 
    

    因爲你沒有在表名中沒有特殊字符或關鍵字,忘記 方括號。

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

    你不能參數OPENROWSET BULK文件讀取。 唯一的方法是使用動態SQL,see this

    另一個問題是將varbinary BLOB分配給xml變量,如果沒有類型轉換, 將無法​​工作,如CAST(P as xml)。只要注意 就是你真正加載的內容,因爲非格式良好的XML片段 會在此處引發錯誤。

  3. 另一個問題是使用sp_xml_preparedocument程序。你真的需要它嗎? 使用這種XML解析可以限制你的xml資源。此外,如果您忘記 致電(或跳過因爲錯誤)sp_xml_removedocument因此得到錯誤 。 AFAIK,服務器重啓將在這裏幫助。

    注意:sp_xml_preparedocument易受攻擊,因此請注意您的XML文件 來自哪裏。

當您清除此問題時,有幾個問題保持打開:您需要什麼樣的第二個參數(列名稱),爲什麼?它應該是一個XML參數嗎?它應該使用提示什麼樣的孩子應該從批量加載的XML根提取?

當你對此進行分類時,我相信可以構建一個存儲過程,但不是沒有一些動態表達式。

相關問題