为什么DB_NAME()不能用在动态语句中

问题描述 投票:0回答:3

当我在 SQL Server 2008 中编写这样的 SQL 语句时:

exec(N'update '+DB_NAME()+'..sys_bizfiles set idtask=@newID where to_row_guid=@Lrow_guid')

仍然是,

DB_NAME()
有语法错误。

DB_NAME()
是否返回数据库名称
nvarchar()
字符串?怎么了?

sql sql-server-2008 syntax-error
3个回答
2
投票

EXEC
是限量生产,并且 not 接受通用表达:没有函数可以在这种情况下使用。

{ EXEC | EXECUTE } 
    ( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )

也就是说,EXEC 接受变量字符串文字 - 可以混合和连接。

DB_NAME()
都不是这些,因此会导致受限产生式中的语法错误。

例如,以下内容是有效的,因为它遵循允许的形式:

declare @name nvarchar(max) = DB_NAME()
exec('select ''' + @name + ''' as db')

(与原始代码一样,

exec('select ''' + DB_NAME() + ''' as db')
无效,因为
DB_NAME()
既不是变量也不是字符串文字。)


1
投票

这样使用

DECLARE @QUERY nvarchar(500) = N'update '+cast(DB_NAME() as varchar)+'..sys_bizfiles set idtask=@newID where to_row_guid=@Lrow_guid' 
exec @QUERY

不需要强制转换为“user3127259”

DECLARE @QUERY nvarchar(500) = N'update ' + DB_NAME() +'.dbo.sys_bizfiles set idtask=@newID where to_row_guid=@Lrow_guid' 
exec @QUERY

0
投票

解决此问题的最佳方法是使用数据库名称变量:

DECLARE @databaseName VARCHAR(MAX) = DB_NAME();
© www.soinside.com 2019 - 2024. All rights reserved.