避免使用dynamic from子句

时间:2016-06-23 09:14:05

标签: sql sql-server dynamic clause

如何避免使用动态from子句?即使我不知道数据库名称,我更喜欢使用静态语句,如下所示:

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

我收到了这个错误: Msg 102,Level 15,State 1,Line 6 '。'附近的语法不正确。

我需要使用 select into 子句,因为列名可能与每个数据库不同;

谢谢!

2 个答案:

答案 0 :(得分:1)

不幸的是,您必须为此使用动态SQL,请参阅下面的示例

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

execute sp_executesql @SQL 

答案 1 :(得分:0)

  

如何避免使用动态from子句?即使我不知道数据库名称,我更喜欢使用静态语句

SQL不会接受列名,表名,数据库名作为参数。除非你避免使用它们,否则你不能避免使用动态sql ..

将您的查询更改为动态SQL以避免错误。但是再次出现临时表范围问题

- 这将失败,因为临时表属于不同的范围

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   '+@DBName+'.dbo.test_Delete '
    exec(@sql)
    select * from ##temptable

但要注意上述方法,因为上面的临时表具有全局范围..

您也可以使用Openrowset,如下所示

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