【问题标题】:Stored Procedure / SQL variable inside OPENQUERY stringOPENQUERY 字符串中的存储过程/SQL 变量
【发布时间】:2012-05-10 10:06:47
【问题描述】:

我在存储过程中使用 OPENQUERY(从链接服务器获取数据)时遇到问题。我一直在阅读 SQL 变量,但似乎无法让它工作,所以也许我误解了 SQL 中的变量/字符串。它抛出错误“'+'附近的语法不正确”。而且我不确定自己做错了什么。

代码:

ALTER PROCEDURE [dbo].[sp_getPerson]
@myName nvarchar(MAX)
AS
BEGIN
SET NOCOUNT ON;

SELECT     *
    FROM         OPENQUERY(MY_LINKED_SERVER, 'SELECT * FROM myTable
WHERE (myName= ''' + @myName + ''')
') AS derivedtbl_1

END

理论上应该可行吗?

【问题讨论】:

    标签: sql-server-2005 stored-procedures openquery


    【解决方案1】:

    我会将整个查询放入一个变量中并执行该变量。

    declare @myName nvarchar(MAX)
    declare @sqltext varchar(max)
    
    
    select  @myName = 'Some Name'
    
    select @sqltext='
    select * from openquery(MY_LINKED_SERVER,''select * from database.schema.table
    where myName = '''+@myName +'''
    )'
    
    
    exec (@sqltext)
    

    如果您使用 LINKED_SERVER.DATABASE.SCHEMA.TABLE,您可能会遇到性能问题,具体取决于表大小等,因为此查询不使用任何索引。

    【讨论】:

      【解决方案2】:

      您所要做的就是通过脚本添加链接服务器

      http://msdn.microsoft.com/en-us/library/ms189811.aspx sp_addlinkedsrvlogin

      如果你的链接服务器是 TEST-SQL,数据库是 test01,表名是 testtb

      和....

      从另一个服务器查询它是这样的。

      select * from [TEST-SQL].test01.dbo.testtb linktedTB where .... 
      

      您还可以将表连接到链接服务器。

      【讨论】:

      • 太棒了!我只是有点不确定语法 - 链接表是否也需要完整的前缀?例如。 SELECT * FROM [LINKED_SERVER].MYDATABASE.dbo.MYTABLE1 左外连接 [LINKED_SERVER].MYDATABASE.dbo.MYTABLE2 ON...
      • exec sp_addlinkedserver @server='test-sql01'; exec sp_addlinkedsrvlogin @rmtsrvname='test-sql01',@useself=false, @rmtuser='sa', @rmtpassword='sapassword';是的,它需要整个前缀.. 但您可以将链接服务器表命名为顶部指定的别名。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 2017-06-05
      • 1970-01-01
      相关资源
      最近更新 更多