Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
2008年编写的SQL查询在2005年不起作用_Sql_Sql Server_Syntax - Fatal编程技术网

2008年编写的SQL查询在2005年不起作用

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

我在运行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, 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的值部分的表达式。我尝试了这种方法,但不幸的是没有成功(不是我投了反对票)。