Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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
Sql server 在此上下文中不允许子查询。只允许使用标量表达式_Sql Server_Stored Procedures - Fatal编程技术网

Sql server 在此上下文中不允许子查询。只允许使用标量表达式

Sql server 在此上下文中不允许子查询。只允许使用标量表达式,sql-server,stored-procedures,Sql Server,Stored Procedures,我的存储过程在SQLServer2008中运行良好,但当我尝试在SQLServer2005中运行相同的过程时,它会抛出以下错误: 在此上下文中不允许子查询。只允许使用标量表达式 以下是我的sp USE dbEmployeeManagementSystem GO CREATE PROCEDURE [dbo].spInsertTaskAssignmentsample ( @Username nvarchar(50), @ProjectName nvarchar(50), @ClientName nv

我的存储过程在SQLServer2008中运行良好,但当我尝试在SQLServer2005中运行相同的过程时,它会抛出以下错误:

在此上下文中不允许子查询。只允许使用标量表达式

以下是我的sp

USE dbEmployeeManagementSystem
GO
CREATE PROCEDURE [dbo].spInsertTaskAssignmentsample
(
@Username nvarchar(50),
@ProjectName nvarchar(50),
@ClientName nvarchar(50),
@Status nvarchar(50),
@StartDate nvarchar(50),
@EndDate nvarchar(50),
@ReportingManager nvarchar(50),
@Comments nvarchar(100)
 )
AS
BEGIN   
INSERT INTO tblTaskAssignment
(EID,ProjectName, ClientName, Status, StartDate, EndDate,ReportingManager,Comments) 
Values
((SELECT top 1 EID FROM tblLogin WHERE Username=@Username), @ProjectName, @ClientName, @Status, @StartDate, @EndDate,@ReportingManager,@Comments)
END
请帮助我,是否有任何解决方案用于此或sql 2005不支持此类查询


提前感谢。

SQLServer2005不支持此功能。它于2008年推出

您可以将子查询的结果分配给变量,并在
VALUES
子句中使用该变量。

备选方案1:

您可以将EID放入如下变量:

    CREATE PROCEDURE [dbo].spInsertTaskAssignmentsample
    (
    @Username nvarchar(50),
    @ProjectName nvarchar(50),
    @ClientName nvarchar(50),
    @Status nvarchar(50),
    @StartDate nvarchar(50),
    @EndDate nvarchar(50),
    @ReportingManager nvarchar(50),
    @Comments nvarchar(100)
     )
    AS
    BEGIN

    DECLARE @EID INT;
    SET @EID = (SELECT top 1 EID FROM tblLogin WHERE Username=@Username);

    INSERT INTO tblTaskAssignment
    (EID,ProjectName, ClientName, Status, StartDate, EndDate,ReportingManager,Comments) 
    Values
    (@EID, @ProjectName, @ClientName, @Status, @StartDate, @EndDate,@ReportingManager,@Comments)
    END
如果EID不是整数类型,则必须在declare语句中指定该类型

备选案文2: 使用SELECT子句

    CREATE PROCEDURE [dbo].spInsertTaskAssignmentsample
    (
    @Username nvarchar(50),
    @ProjectName nvarchar(50),
    @ClientName nvarchar(50),
    @Status nvarchar(50),
    @StartDate nvarchar(50),
    @EndDate nvarchar(50),
    @ReportingManager nvarchar(50),
    @Comments nvarchar(100)
     )
    AS
    BEGIN

    INSERT INTO tblTaskAssignment
    (EID,ProjectName, ClientName, Status, StartDate, EndDate,ReportingManager,Comments) 
    SELECT TOP 1 EID, @ProjectName, @ClientName, @Status, @StartDate, @EndDate,@ReportingManager,@Comments FROM tblLogin WHERE Username=@Username 
    END

您可以使用
SELECT
而不是
VALUES
子句:

INSERT INTO tblTaskAssignment
(EID,ProjectName, ClientName, Status, StartDate, EndDate,
    ReportingManager,Comments) 
SELECT top 1 EID, @ProjectName, @ClientName, @Status, @StartDate, @EndDate,
    @ReportingManager,@Comments
FROM tblLogin WHERE Username=@Username
INSERT INTO tblTaskAssignment
(EID,ProjectName, ClientName, Status, StartDate, EndDate,ReportingManager,Comments) 
SELECT (SELECT TOP 1 EID FROM tblLogin WHERE Username=@Username), @ProjectName, @ClientName, @Status, @StartDate, @EndDate,@ReportingManager,@Comments

(请注意,根据Martin Smith和ta.speot.is之间的讨论,这确实假设
tblLogin
中至少有一行与
@Username
匹配)

您可以使用
选择
而不是
子句:

INSERT INTO tblTaskAssignment
(EID,ProjectName, ClientName, Status, StartDate, EndDate,
    ReportingManager,Comments) 
SELECT top 1 EID, @ProjectName, @ClientName, @Status, @StartDate, @EndDate,
    @ReportingManager,@Comments
FROM tblLogin WHERE Username=@Username
INSERT INTO tblTaskAssignment
(EID,ProjectName, ClientName, Status, StartDate, EndDate,ReportingManager,Comments) 
SELECT (SELECT TOP 1 EID FROM tblLogin WHERE Username=@Username), @ProjectName, @ClientName, @Status, @StartDate, @EndDate,@ReportingManager,@Comments

使用
插入到。。。选择
为变量赋值似乎有些过分。不支持
插入到。。。选择
?@ta.speot.is-确实如此,但如果子查询返回的
0
行更复杂。它应该插入
NULL
。变量和子查询将返回
NULL
<代码>插入到。。。选择(子查询),@v1,@v2@ta.speot.is-Ah明白你的意思了。我以为你的意思是插入。。。从tblLogin中选择前1个EID、@ProjectName、@ClientName,其中Username=@Username我不会说变量是多余的……这只是完成工作的两种方法。我不会说差异有那么大:)@ta.speot.is-我只是补充了这一点作为一个具体的假设-我们不知道OP是否需要处理这一方面(也许在这种情况下原始查询甚至在2008年也会出现,因为
EID
不可为空)或者将
插入写入。。。选择
时不要做出假设。@ta.speot.is-关键是,您假设这里的
NULL
是一个有效值,也是一个理想的结果。OP也假设,因此,在他们的问题的上下文中,我不做任何假设。如果tblLogin表中没有具有
@Username
的用户,则备选方案2可能会失败,但只有当存储过程希望输入“缺失的”
@Username
时,这才是一个问题