2016-06-23 6 views
1

dynamic from 절을 사용하지 않으려면 어떻게해야합니까? 내가 데이터베이스 이름을 모르는 경우에도, 나는이 같은 정적 문을 사용하는 것을 선호 :dynamic from 절 사용 안 함

select * 
    into #tempTable 
    from @DBName.Invoices 
    where InvoiceId = 5. 

나는이 오류가있어 : 메시지 102, 수준 15, 상태 1, 줄을 6 근처의 구문이 잘못되었습니다 '.'.

나는 열 이름은 각 데이터베이스 다를 수 있기 때문에 절에 선택 를 사용해야합니다;

감사합니다. 불행하게도

+1

이하와 같은 어떤 것을 사용할 수 있습니까? 동적 SQL을 사용하지 않고 변수에 보관 된 객체를 선택할 수 없습니다. –

+0

불행히도 동적 SQL 만 도움이됩니다. 자신 만의 proc를 만들거나 지원되지 않는 sp_MSforEachDB를 사용할 수 있습니다. http://weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx – Serg

답변

0

이 동적 SQL을 사용해야합니다, 당신은 캔트 당신이 그들을 위험이 있으므로하지 않는 parameters.so로 COLUMNNAMES, 테이블 이름, databasenames을 받아

Declare @DBNAME NVARCHAR(MAX) = 'xxx' 
Declare @SQL NVARCHAR(MAX) ='select * 
into #tempTable 
from ' + @DBName + '.Invoices 
where InvoiceId = 5.' 

execute sp_executesql @SQL 
0

How can i avoid using dynamic from clause? Even if i don't know the database name, i prefer to use a static statement

SQL 실 거예요 예는 아래를 참조한다 ,

다시 당신이

--This이 실패합니다 임시 테이블의 범위에 문제가있는 것 error..But을 방지하기 위해 동적 SQL로 조회를 변경

.. 동적 SQL을 피하기 becau 자체의 임시 테이블에 ..

Declare @sql nvarchar(4000) 
set @sql=' 
select * 
    into #tempTable 
    from @DBName.Invoices 
    where InvoiceId = 5' 
--- 하나의 옵션은 위의 임시 테이블 이후, 글로벌 임시 테이블

declare @dbname varchar(1000) 
set @dbname=db_name() 

declare @sql nvarchar(4000) 
set @sql='select * 
    into ##tempTable 
    from '[email protected]+'.dbo.test_Delete ' 
    exec(@sql) 
    select * from ##temptable 

를 사용하지만 위의 방법과주의 하시고하는 글로벌 범위가 다른 범위에 해당

또한 OPENROWSET, 당신이 뭘 하려는지

select * into #temp from openrowset 
('SQLNCLI','Server=yourinstancename;Trusted_Connection=yes;', 'select * form table')