Sql server 无法在选择列上绑定多部分标识符
我正在设置此存储过程,出现以下错误: 无法绑定多部分标识符 在“选择”中的所有列上 这是我的疑问:Sql server 无法在选择列上绑定多部分标识符,sql-server,tsql,Sql Server,Tsql,我正在设置此存储过程,出现以下错误: 无法绑定多部分标识符 在“选择”中的所有列上 这是我的疑问: ALTER PROCEDURE [dbo].[Ps_GetEquipeProjet] @PROJET_ID INT = NULL, @RoleID INT = NULL AS BEGIN DECLARE @requete VARCHAR(250) SET @requete = (SELECT CleRepartition FROM EQUIPE_PROJET
ALTER PROCEDURE [dbo].[Ps_GetEquipeProjet]
@PROJET_ID INT = NULL,
@RoleID INT = NULL
AS
BEGIN
DECLARE @requete VARCHAR(250)
SET @requete = (SELECT CleRepartition FROM EQUIPE_PROJET
WHERE Projet_Id = @PROJET_ID AND Role_Id = 3
AND CleRepartition IS NOT NULL)
SELECT
EP.Equipe_Projet_Id AS PROJET_ID,
U.USR_ID, U.USR_NOM, U.USR_PRENOM,
U.USR_LOGIN,
RE.Role_Eq_Libelle AS ROLE_NOM,
EP.CleRepartition = CASE
WHEN @RoleID = 1 AND @requete IS NOT NULL AND @requete = 75
THEN 25
WHEN @RoleID = 1 AND @requete IS NOT NULL AND @requete = 50
THEN 50
WHEN @RoleID = 2 AND @requete IS NOT NULL
THEN 20
ELSE NULL
END
FROM
[EQUIPE_PROJET] EP
INNER JOIN
UTILISATEUR U ON U.USR_ID = EP.[User_Id]
INNER JOIN
Ref_Role_Eq RE ON RE.Role_Eq_Id = EP.[Role_Id]
WHERE
(@PROJET_ID IS NULL OR @PROJET_ID = EP.[Projet_Id])
AND EP.Deletion_Date IS NULL
AND (@RoleID IS NULL OR [Role_Id] = @RoleID)
END
正如我在评论中所说的,在将数据集返回到表示层的同一语句中,不能
更新列。您需要先更新CleRepartition
的值,然后执行选择。我无法测试这一点,但猜测一下,也许这就是您需要的:
ALTER PROCEDURE [dbo].[Ps_GetEquipeProjet] @PROJET_ID int = NULL,
@RoleID int = NULL
AS
BEGIN
DECLARE @requete varchar(250);
SET @requete = (SELECT CleRepartition
FROM EQUIPE_PROJET
WHERE Projet_Id = @PROJET_ID
AND Role_Id = 3
AND CleRepartition IS NOT NULL);
UPDATE EP
SET CleRepartition = CASE
WHEN @RoleID = 1
AND @requete IS NOT NULL
AND @requete = 75 THEN 25
WHEN @RoleID = 1
AND @requete IS NOT NULL
AND @requete = 50 THEN 50
WHEN @RoleID = 2
AND @requete IS NOT NULL THEN 20
ELSE NULL
END
FROM [EQUIPE_PROJET] EP
INNER JOIN UTILISATEUR U ON U.USR_ID = EP.[User_Id]
INNER JOIN Ref_Role_Eq RE ON RE.Role_Eq_Id = EP.[Role_Id]
WHERE (@PROJET_ID IS NULL
OR @PROJET_ID = EP.[Projet_Id])
AND EP.Deletion_Date IS NULL
AND (@RoleID IS NULL
OR [Role_Id] = @RoleID);
SELECT EP.Equipe_Projet_Id AS PROJET_ID,
U.USR_ID,
U.USR_NOM,
U.USR_PRENOM,
U.USR_LOGIN,
RE.Role_Eq_Libelle AS ROLE_NOM,
EP.CleRepartition
FROM [EQUIPE_PROJET] EP
INNER JOIN UTILISATEUR U ON U.USR_ID = EP.[User_Id]
INNER JOIN Ref_Role_Eq RE ON RE.Role_Eq_Id = EP.[Role_Id]
WHERE (@PROJET_ID IS NULL
OR @PROJET_ID = EP.[Projet_Id])
AND EP.Deletion_Date IS NULL
AND (@RoleID IS NULL
OR [Role_Id] = @RoleID);
END;
GO
另一方面,这里的查询被称为“全面查询”,或者(正如Aaron Bertrand所称)一个“厨房水槽”查询。实际上,您希望将动态SQL用于此类查询,或者选项(重新编译)
(我个人支持前者)。这里有几篇盖尔·肖和伯特兰关于这个主题的文章:请给我们完整的错误,而不是一个片段。谢谢。另外,您的一列EP.CleRepartition=
上有一个尾随的等号。我假设应该是EP.CleRepartition,
?EP.CleRepartition的值取决于大小写。这没有意义,EP.CleRepartition
的值取决于大小写
表达式;您不能在执行的语句中更新返回数据集的表。如果您需要更新EP.CleRepartition
的值,则需要使用单独的update
语句解释我为什么会识别该值,@SMorThank you Larnu。程序第一次执行时就开始工作了。第二次它使所有列的CleRepartition为null并不奇怪,因为25!=1
。这就是你要求的逻辑,我不明白。我不知道,因为我只向你展示了你的要求。你需要理解和支持它。如果你不明白,那么你需要问一下。