【问题标题】:Using a Variable in OPENROWSET Query在 OPENROWSET 查询中使用变量
【发布时间】:2023-04-06 01:10:01
【问题描述】:

我在处理这个查询时遇到了问题:

SELECT * 
FROM OPENROWSET(
    'SQLNCLI',
    'DRIVER={SQL Server};',
    'EXEC dbo.sProc1 @ID = ' + @id 
 )

给出错误:

“+”附近的语法不正确。

有人知道我为什么会收到这个错误吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008 openrowset


    【解决方案1】:

    按照 Scott 的建议,您不能在 OPENROWSET 中使用表达式。尝试创建动态 sql 来传递参数

    Declare @ID int
    Declare @sql nvarchar(max)
    Set @ID=1
    Set @sql='SELECT * 
    FROM OPENROWSET(
                   ''SQLNCLI'',
                   ''DRIVER={SQL Server};'',
                   ''EXEC dbo.usp_SO @ID =' + convert(varchar(10),@ID) + ''')'
    
    -- Print @sql
     Exec(@sql)
    

    【讨论】:

      【解决方案2】:

      OPENROWSET 需要字符串文字,而不是表达式。它抱怨加号,因为它只期望字符串文字,并且您在字符串文字后面加上一个运算符。

      参见http://msdn.microsoft.com/en-us/library/ms190312.aspx 声明:

      '查询'

      是一个字符串常量发送到提供者并由提供者执行...

      【讨论】:

      • 感谢 Scott,我认为收到的错误信息给了我这个想法。
      【解决方案3】:
      Declare @Route VARCHAR(200)
      Declare @sql nvarchar(max)
      Set @Route='C:\OCRevisiones.xlsx;'
      Set @sql='SELECT * INTO FFFF
      FROM OPENROWSET(
                     ''Microsoft.ACE.OLEDB.12.0'',
                     ''Excel 12.0;HDR=YES;Database=' + @Route + ''',
                     ''SELECT * FROM [Sheet1$]'')'
      
       Print @sql
       --Exec(@sql)
      

      【讨论】:

      • 嗨,欢迎来到 StackOverflow。请不要只发布代码答案,但要包含解释。特别是对于这样的问题,问题是“为什么这不起作用?”而不是“还有什么用?”
      • 虽然我通常同意帖子应该有一些解释,但由于该问题已于 2012 年 12 月得到回答,因此不需要太多解释。我发现此响应很有用,因为它显示了连接到 Excel 文件(数据库参数)和 sheet$ 作为 SQL Server 数据库和表的替代方案。
      【解决方案4】:

      如果需要参数也可以使用sp_executesql:

      BEGIN
      
      DECLARE
      @p_path varchar(200)='D:\Sample\test.xml',  
      @v_xmlfile xml,
      @v_sql nvarchar(1000)
      
      SET @v_sql=N'select @v_xmlfile= CONVERT(XML, BulkColumn) FROM 
      OPENROWSET(BULK '''+@p_path+''', SINGLE_BLOB) AS x;'
      
      EXEC sp_executesql @v_sql,N'@v_xmlfile xml output',@v_xmlfile output;
      
      SELECT @v_xmlfile
      
      END
      

      【讨论】:

        【解决方案5】:

        为了它的价值.. 我们使用 openrowset 而不是直接链接服务器查询的原因是链接服务器查询的处理发生在本地服务器上。 (缓慢且经常将大部分桌子带回来)

        是的,我们可以像上面那样进行字符串连接。

        一个不同的选项,您可以使用简单的语法和强大的参数。

        在远程机器上创建一个存储过程,该过程具有您需要的所有参数。 使用标准链接服务器查询调用存储的过程(性能相同或比上述灵魂更好,并且更容易编码。

        例如linkedservername.database.dbo.myproc 123,'abc','someparam',getdate()

        只是一个选择....

        【讨论】:

        • 如果它解释了它是如何解决问题的,这个答案可能会更好。
        【解决方案6】:

        您可以使用Char(39) 代替'

        set @lcSql= 'SELECT production_pbook_uq,variety_uq,color_uq,grade_uq,diff_qty
                    FROM OPENROWSET("SQLNCLI",
                    "Server=.;Trusted_Connection=yes;",
                    "EXEC serversql.dbo.sp_flower_production_varieties_consolidated @lcproduction_pbook_uq='+char(39)+@lcWo_uq+char(39)+', @lcproduct_piso_uq ='+char(39)+@lcpiso_uq+char(39)+'")'
                    +'where diff_qty>0'
        
        print @lcSql 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-21
          • 2021-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多