当我在 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()
字符串?怎么了?
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()
既不是变量也不是字符串文字。)
这样使用
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
解决此问题的最佳方法是使用数据库名称变量:
DECLARE @databaseName VARCHAR(MAX) = DB_NAME();