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
。这就是你要求的逻辑,我不明白。我不知道,因为我只向你展示了你的要求。你需要理解和支持它。如果你不明白,那么你需要问一下。