避免使用动态 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')