2016-06-23 2 views
1

Как я могу избежать использования предложения dynamic from? Даже если я не знаю, имя базы данных, я предпочитаю использовать статический оператор, например:Избегайте использования динамического из предложения

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

Я получил эту ошибку: Msg 102, Level 15, State 1, Line 6 Неправильный синтаксис около ''.

мне нужно использовать выбрать в пункта, потому что имена столбцов могут отличаться друг от баз данных;

Спасибо!

+1

Что вы пытаетесь сделать? Вы не можете выбрать объект, хранящийся в переменной, без использования динамического sql. –

+0

К сожалению, только динамический sql поможет. Вы можете создать свой собственный proc или использовать неподдерживаемый sp_MSforEachDB http://weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx – Serg

ответ

0

К сожалению, вам придется использовать динамический SQL для этого, смотрите ниже для примера

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 не примет columnnames, tablenames, databasenames как parameters.so, если вам не избежать их, вы не можете избегать динамического SQL ..

Изменить запрос динамического SQL, чтобы избежать error..But снова вы будете иметь проблемы с областью временных таблиц

--This подведет, 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') 
Смежные вопросы