Sql 消息102,15级,状态1,第1行'附近语法不正确-';。我错过了一些东西

Sql 消息102,15级,状态1,第1行'附近语法不正确-';。我错过了一些东西,sql,sql-server,tsql,syntax-error,Sql,Sql Server,Tsql,Syntax Error,有人能给我解释一下为什么我会犯这个错误吗?我知道这与DB名称中有破折号有关 declare @dname varchar(80) declare @cmnd varchar(2000) DECLARE get_db CURSOR FOR select name from sysdatabases where dbid > 9 open get_db FETCH NEXT from get_db into @dname WHILE(@@FETCH_STATUS = 0) begin

有人能给我解释一下为什么我会犯这个错误吗?我知道这与DB名称中有破折号有关

declare @dname varchar(80)
declare @cmnd varchar(2000)

DECLARE get_db CURSOR FOR
   select name from sysdatabases where dbid > 9

open get_db
FETCH NEXT from get_db into @dname
WHILE(@@FETCH_STATUS = 0)
begin
          set @cmnd = 'if (select count(name) from ' + @dname + '.dbo.sysobjects where name = ''SQLLOG'')=1 begin TRUNCATE TABLE ' + @dname + '.dbo.sqllog end'
          exec (@cmnd)
          --print @cmnd
FETCH NEXT from get_db into @dname
end
close get_db
deallocate get_db

@dname
将保存来自
系统数据库的值。如果其中一个数据库包含
-
,则需要将变量括在`中或使用
quotename
。基本上,无论何时以命令形式运行字符串,都需要确保没有可能的问题,特别是如果数据是由用户添加的

set @cmnd = 'if (select count(name) from `' + @dname + '`.dbo.sysobjects where name = 'SQLLOG')=1 begin TRUNCATE TABLE `' + @dname + '`.dbo.sqllog end'


如果数据库名称不是正确的标识符,必须将其转义,请尝试:`。。。从['+@dname+'].dbo.sysobjects…`使用。这也正确地处理了嵌入式
]
set @cmnd = 'if (select count(name) from quotename(\'' + @dname + '\').dbo.sysobjects where name = 'SQLLOG')=1 begin TRUNCATE TABLE ' + @dname + '.dbo.sqllog end'