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