避免使用动态 from 子句
Avoid using dynamic from clause
如何避免使用 dynamic from 子句?即使我不知道数据库名称,我更喜欢使用静态语句,像这样:
select *
into #tempTable
from @DBName.Invoices
where InvoiceId = 5.
我收到此错误: 消息 102,级别 15,状态 1,第 6 行
“.”附近的语法不正确。
我需要在 子句中使用 select 因为列名可能与每个数据库不同;
谢谢!
不幸的是,您将不得不为此使用动态 SQL,请参阅下面的示例
Declare @DBNAME NVARCHAR(MAX) = 'xxx'
Declare @SQL NVARCHAR(MAX) ='select *
into #tempTable
from ' + @DBName + '.Invoices
where InvoiceId = 5.'
execute sp_executesql @SQL
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 不会接受列名、table 名称、数据库名称作为 parameters.so 除非你避免它们,否则你无法避免动态 sql..
将您的查询更改为动态 sql 以避免错误。但是您将再次遇到临时 tables 范围
的问题
--这会失败,因为temp table属于不同的范围
Declare @sql nvarchar(4000)
set @sql='
select *
into #tempTable
from @DBName.Invoices
where InvoiceId = 5'
---一个选项是使用全局温度 tables
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
但要小心上述方法,因为上面的温度 table 具有全局范围..
您也可以使用 Openrowset,如下所示
select * into #temp from openrowset
('SQLNCLI','Server=yourinstancename;Trusted_Connection=yes;', 'select * form table')
如何避免使用 dynamic from 子句?即使我不知道数据库名称,我更喜欢使用静态语句,像这样:
select *
into #tempTable
from @DBName.Invoices
where InvoiceId = 5.
我收到此错误: 消息 102,级别 15,状态 1,第 6 行 “.”附近的语法不正确。
我需要在 子句中使用 select 因为列名可能与每个数据库不同;
谢谢!
不幸的是,您将不得不为此使用动态 SQL,请参阅下面的示例
Declare @DBNAME NVARCHAR(MAX) = 'xxx'
Declare @SQL NVARCHAR(MAX) ='select *
into #tempTable
from ' + @DBName + '.Invoices
where InvoiceId = 5.'
execute sp_executesql @SQL
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 不会接受列名、table 名称、数据库名称作为 parameters.so 除非你避免它们,否则你无法避免动态 sql..
将您的查询更改为动态 sql 以避免错误。但是您将再次遇到临时 tables 范围
的问题--这会失败,因为temp table属于不同的范围
Declare @sql nvarchar(4000)
set @sql='
select *
into #tempTable
from @DBName.Invoices
where InvoiceId = 5'
---一个选项是使用全局温度 tables
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
但要小心上述方法,因为上面的温度 table 具有全局范围..
您也可以使用 Openrowset,如下所示
select * into #temp from openrowset
('SQLNCLI','Server=yourinstancename;Trusted_Connection=yes;', 'select * form table')