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

时间:2013-12-26 07:57:58

标签: sql sql-server-2008 syntax-error

当我在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()数据库名称字符串?有什么问题?

2 个答案:

答案 0 :(得分:2)

EXEC是限量制作,接受一般表达式:无函数可用于此上下文。

{ 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 :(得分: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

Cast不需要“user3127259”

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