【问题标题】:SQL Server Stored Procedure with a FileName variable带有 FileName 变量的 SQL Server 存储过程
【发布时间】:2014-05-09 13:54:33
【问题描述】:

我在从 xml 文件加载数据时遇到了一些严重问题。我想将其声明为以 .xml 文件名作为参数的过程。

GO
ALTER PROCEDURE loadXML 
@FileName varchar(50)
AS
 BEGIN 
    DECLARE @XML AS XML,@hDoc AS INT
    SELECT @XML = CONVERT(XML, BulkColumn) 
    FROM OPENROWSET(BULK 'D:\ '+@FileName , SINGLE_BLOB) AS x;

    EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

    INSERT  INTO [dbo].[Client]
    SELECT *
    FROM OPENXML(@hDoc, 'orderType/client')

    WITH
    (
         OrderId varchar(200) '../../../sn',
         Client_number varchar(200) 'client_number',
         FirstName varchar(200) 'firstname', 
         LastName varchar(200) 'lastname', 
         E-Mail varchar(200) 'email'   
    )

   EXEC sp_xml_removedocument @hDoc   

END

exec loadXML 'order2.xml'

显然,此代码不起作用,因为@FilePath 变量附近存在语法错误。我尝试用整个 SELECT 部分制作字符串变量,但没有奏效。

【问题讨论】:

  • FROM OPENROWSET(BULK ' + 'D:\'+@FileName'' , SINGLE_BLOB) AS x;?我会说你的单引号搞砸了。哦,请发布确切的错误消息。
  • 好的,我用引号清理了乱七八糟的东西,谢谢。我收到的这个特定代码的错误是:Msg 102, Level 15, State 1, Procedure loadXML, Line 7 Incorrect syntax near '+'.
  • 你不能这样连接。最好是像我在回答中提到的那样将整个路径作为参数传递。

标签: sql-server stored-procedures


【解决方案1】:

为什么不将整个路径与驱动器名称一起作为参数传递。我的意思是D:\folder1\file.xml

假设@FileName 参数具有像D:\folder1\file.xml 这样的完整路径,那么您可以使用动态查询来实现您正在寻找的内容,如下所示。试试看

DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'set @XML = (SELECT '+ @XML + ' = CONVERT(XML, BulkColumn) 
    FROM OPENROWSET(BULK ' + @FileName +' , SINGLE_BLOB) AS x)';

declare @xml xml;

EXEC sp_executesql @sqlCommand, N'@XYZ xml output', @xml output


EXEC sp_xml_preparedocument @hDoc OUTPUT, @XYZ;

 //rest of the code here

【讨论】:

  • 还是什么都没有。消息 156,级别 15,状态 1,过程 loadXML,第 8 行关键字“SELECT”附近的语法不正确。消息 102,级别 15,状态 1,过程堆栈,第 8 行 ')' 附近的语法不正确。不会创建过程,并且 BulkColumn、您的 SELECT 和 SINGLE_BLOB 都带有下划线。
  • @PRHMN,编辑了我的答案。您可以使用动态查询。试一试。
  • 是的,设法解决了这个问题。我的代码略有不同,但这个想法很常见。感谢所有的努力! :)
猜你喜欢
  • 2014-09-04
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 2020-12-19
  • 2016-05-30
  • 1970-01-01
相关资源
最近更新 更多