2012-05-10 929 views
2

저장 프로 시저 내에서 OPENQUERY (연결된 서버에서 데이터를 가져 오는 데 사용)하는 데 문제가 있습니다. SQL 변수를 읽었지만 작동하지 않는 것 같아서 SQL의 변수/문자열을 오해하고있는 것 같습니다. 그것은 "잘못된 구문을 '+'근처에 던지고 있습니다." 그리고 내가 뭘 잘못하고 있는지 모르겠습니다.OPENQUERY 문자열 내 저장 프로 시저/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 

해야하는이 작품, 이론?

답변

0

은 당신이해야 할 모든 스크립트를 통해 연결된 서버를 추가한다

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

연결된 서버가 TEST-SQL은 데이터베이스가 test01과 테이블 이름 인 경우 testtb

및 ....

다른 서버에서 쿼리하는 것과 같습니다.

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

그리고 연결된 서버에 테이블을 조인 할 수도 있습니다.

+0

좋아요! 나는 구문에 대해 조금 확신하지 못한다. 링크 된 테이블은 전체 접두사를 필요로 할까? 예. SELECT * FROM [LINKED_SERVER] .MYDATABASE.dbo.MYTABLE1 LEFT OUTER JOIN [LINKED_SERVER] .MYDATABASE.dbo.MYTABLE2 ON ... – valoukh

+0

exec sp_addlinkedserver @ server = 'test-sql01'; exec sp_addlinkedsrvlogin @ rmtsrvname = 'test-sql01', @ useself = false, @ rmtuser = 'sa', @ rmtpassword = 'sapassword'; 예. 전체 접두어가 필요합니다. 그러나 연결된 SERVER-TABLE의 별명을 위에서 아래로 지정할 수 있습니다. – maSTAShuFu

1

전체 쿼리를 변수에 넣고 변수를 실행했습니다. 당신이 LINKED_SERVER.DATABASE.SCHEMA.TABLE를 사용하는 경우에는 인덱스가이 쿼리에 사용되지 않기 때문에

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 = '''[email protected] +''' 
)' 


exec (@sqltext) 

, 당신은 등 테이블 크기에 따라 성능 문제가있을 수 있습니다.