2008年编写的SQL查询在2005年不起作用
我在运行SQL Server 2008的开发环境中编写了一个触发器。然后,我尝试在运行2008年编写的SQL查询在2005年不起作用,sql,sql-server,syntax,Sql,Sql Server,Syntax,我在运行SQL Server 2008的开发环境中编写了一个触发器。然后,我尝试在运行SQLServer2005的生产环境中执行它 我得到以下错误: Msg 102, Level 15, State 1, Procedure trg_issues_update, Line 97 Incorrect syntax near ','. 查询如下所示: INSERT INTO users (username, firstname, surname, pwd, emailaddress, resetp
SQLServer2005
的生产环境中执行它
我得到以下错误:
Msg 102, Level 15, State 1, Procedure trg_issues_update, Line 97
Incorrect syntax near ','.
查询如下所示:
INSERT INTO users (username, firstname, surname, pwd, emailaddress, resetpwd, comment, apikey, active)
VALUES (@username, @first_name, @last_name, @password, @email, NULL, 'Comment: ' + CAST(@issueid AS VARCHAR), 'None', '1');
更新:这是触发器中声明/设置大多数变量的部分:
IF (SELECT projectid FROM inserted) = 55 AND (SELECT issuestatusid FROM inserted) = 28 BEGIN
DECLARE @full_name nvarchar (255)
SET @full_name = (SELECT fielddata FROM customfielddata WHERE issueid = @issueid AND customfieldid = 84)
DECLARE @first_name nvarchar (255)
SET @first_name = SUBSTRING(@full_name, 1, CHARINDEX(' ', @full_name) - 1)
DECLARE @last_name nvarchar (255)
SET @last_name = SUBSTRING(@full_name, CHARINDEX(' ', @full_name) + 1, LEN(@full_name) + 1)
DECLARE @email nvarchar (255)
SET @email = (SELECT fielddata FROM customfielddata WHERE issueid = @issueid AND customfieldid = 85)
DECLARE @location nvarchar (255)
DECLARE @domain nvarchar (255)
DECLARE @username nvarchar (255)
SET @location = (SELECT fielddata FROM customfielddata WHERE issueid = @issueid AND customfieldid = 86)
SET @domain = (SELECT fielddata FROM customfielddata WHERE issueid = @issueid AND customfieldid = 87)
IF @location = 'Canada' BEGIN SET @username = 'ORG1\' + UPPER(@domain) END
ELSE SET @username = 'ORG2\' + UPPER(@domain)
DECLARE @password binary (16)
SET @password = CONVERT(BINARY(16), HashBytes('MD5', ''), 2)
DECLARE @comment nvarchar (500)
SET @comment = 'APPR-' + CAST(@issueid AS VARCHAR)
INSERT INTO users (username, firstname, surname, pwd, emailaddress, resetpwd, comment, apikey, active)
VALUES (@username, @first_name, @last_name, @password, @email, NULL, @comment, 'None', '1');
DECLARE @userid NUMERIC(10,0)
SET @userid = (SELECT userid FROM users WHERE username = @username)
INSERT INTO globalgroupmembership (globalgroupid, userid, created)
VALUES (1, @userid, CURRENT_TIMESTAMP), (3, @userid, CURRENT_TIMESTAMP)
END
我认为这是因为2005年和2008年的差异,但我无法找出到底是什么错。试着在价值列表之前把评论浓缩起来:
declare @comment varchar
set @comment = 'Comment: ' + cast(@issueid as varchar)
INSERT INTO users (username, firstname, surname, pwd, emailaddress, resetpwd, comment, apikey, active)
select @username, @first_name, @last_name, @password, @email, NULL, @comment, 'None', '1'
问题在于这一行:
INSERT INTO globalgroupmembership (globalgroupid, userid, created)
VALUES (1, @userid, CURRENT_TIMESTAMP), (3, @userid, CURRENT_TIMESTAMP)
发件人:
SQL Server 2008引入了Transact-SQL行构造函数(也称为表值构造函数),以在单个INSERT语句中指定多行。行构造函数由一个VALUES子句组成,其中包含多个值列表,这些值列表用括号括起来,并用逗号分隔
为了解决此问题,使其在SQL 2008和SQL Server 2005中都能工作,您需要将查询重写为:
INSERT INTO globalgroupmembership (globalgroupid, userid, created)
VALUES (1, @userid, CURRENT_TIMESTAMP);
INSERT INTO globalgroupmembership (globalgroupid, userid, created)
VALUES (3, @userid, CURRENT_TIMESTAMP)
或者您可以使用插入到。。。选择…全部联合
:
INSERT INTO globalgroupmembership (globalgroupid, userid, created)
SELECT 1, @userid, CURRENT_TIMESTAMP
UNION ALL
SELECT 3, @userid, CURRENT_TIMESTAMP;
你能分享整个
trg\u issues\u update
吗?是的,我们需要看到触发器来帮助你,因为这就是错误所在。这行值的问题(1,@userid,CURRENT\u TIMESTAMP),(3,@userid,CURRENT\u TIMESTAMP)
2005不支持该行的值(etc),(etc)
,使用多个INSERT
语句或SELECT
和UNION ALL
Thank@bluefeet-我重新编写了该部分,查询成功执行。请随意发布答案,我会接受的。错误消息中的第97行是我最初发布的INSERT查询,哦,好吧。不是我,但我想这是因为2005支持INSERT的值部分的表达式。我尝试了这种方法,但不幸的是没有成功(不是我投了反对票)。