如何避免使用动态from子句?即使我不知道数据库名称,我更喜欢使用静态语句,如下所示:
select *
into #tempTable
from @DBName.Invoices
where InvoiceId = 5.
我收到了这个错误: Msg 102,Level 15,State 1,Line 6 '。'附近的语法不正确。 的
我需要使用 select into 子句,因为列名可能与每个数据库不同;
谢谢!
答案 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')