Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008 where子句中的case语句-SQL Server 2008_Sql Server 2008_Runtime Error_Case_Where In - Fatal编程技术网

Sql server 2008 where子句中的case语句-SQL Server 2008

Sql server 2008 where子句中的case语句-SQL Server 2008,sql-server-2008,runtime-error,case,where-in,Sql Server 2008,Runtime Error,Case,Where In,如果@Account\u Id、@StoreType\u Id和@Store\u Id为空,则应根据应筛选的参数值选择所有的Account\u Id、StoreType\u Id和Store\u Id UDF_SplitString是分割逗号分隔字符串的函数,其返回值如下表所示: SELECT PDADate, T.Merchandizer_ID, T.Merchandizer, Merchandizer_LoginName, STORE_ID, STORE_CODE, STO

如果@Account\u Id、@StoreType\u Id和@Store\u Id为空,则应根据应筛选的参数值选择所有的Account\u Id、StoreType\u Id和Store\u Id

UDF_SplitString是分割逗号分隔字符串的函数,其返回值如下表所示:

SELECT  
   PDADate, T.Merchandizer_ID, T.Merchandizer, Merchandizer_LoginName, 
   STORE_ID, STORE_CODE, STORE_NAME,
   ACCOUNT_ID, ACCOUNT_NAME, Account_Store_Format_Id, Account_Store_Format,
   StoreType_Id, StoreType, T.Listid, T.Listname, 
   T.TimeIn, T.TimeOut, T.PlannedDate, T.Reason, TaskCode, TotalTime 
FROM 
   [dbo].Report_RD_Coverage T 
INNER JOIN 
   #TempLocationH TL ON TL.LocationId=T.Location_Id
WHERE 
   CONVERT(Date, PDADate) Between (@Start_Date) AND Isnull(@End_Date, @CurrentDate)
   AND T.Account_Id IN 
       (SELECT 
            CASE WHEN @Account_Id IS NULL THEN T.Account_Id 
                 ELSE (SELECT * FROM UDF_SplitString(@Account_Id,',')) 
            END
       )    
   AND T.StoreType_Id IN 
       (SELECT 
            CASE WHEN @StoreType_Id IS NULL THEN T.StoreType_Id 
                   ELSE (SELECT * FROM UDF_SplitString(@StoreType_Id,',')) 
            END
       )
  AND T.Store_Id IN
      (SELECT 
           CASE WHEN @Store_Id IS NULL THEN T.Store_Id 
                  ELSE (SELECT * FROM UDF_SplitString(@Store_Id,',')) 
           END
      )
我得到了这个错误:

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时

大小写必须返回标量值,请尝试以下变体:

 - 1
 - 2
 - 3

我试过了,但你必须从我找到的链接中做些什么。 这是我的尝试。您只需要构建@udf数据

select PDADate, T.Merchandizer_ID, T.Merchandizer, Merchandizer_LoginName, STORE_ID, STORE_CODE, 
    STORE_NAME, ACCOUNT_ID, ACCOUNT_NAME, Account_Store_Format_Id, Account_Store_Format, 
    StoreType_Id, StoreType, T.Listid, T.Listname, T.TimeIn, T.TimeOut, T.PlannedDate, 
    T.Reason, TaskCode, TotalTime
from [dbo].Report_RD_Coverage T
inner join #TempLocationH TL on TL.LocationId = T.Location_Id
where CONVERT(date, PDADate) between (@Start_Date)
        and Isnull(@End_Date, @CurrentDate)
    and (
        @Account_Id is null
        or T.Account_Id in (
            select *
            from UDF_SplitString(@Account_Id, ',')
            )
        )
    and (
        @StoreType_Id is null
        or T.StoreType_Id in (
            select *
            from UDF_SplitString(@StoreType_Id, ',')
            )
        )
    and (
        @Store_Id is null
        or T.Store_Id in (
            select *
            from UDF_SplitString(@Store_Id, ',')
            ) end
        )
链接位于

您可以提取粗体sql以及如何创建临时表及其数据的逻辑,我希望您能得到您想要的。

>这是我的正确解决方案……。现在它工作正常了


它的意思就是它所说的。IN语句显然返回了不止一行。我会检查每个IN语句,并确认返回的行数不超过1行。我猜这家伙正在这么做:从UDF中选择*_SplitString@Account_Id完。指定UDF_SplitString函数中返回内容的列名。UDF_SplitString是逗号分隔符的函数,它将返回表中的值。就像我得到答案的那个人。。
declare @Store_Id INT;
declare @Account_Id INT;
DECLARE @UDF[9] OF VARCHAR(30);
set @Store_Id = 99 --NULL  
set @Account_Id = 15  
SET @UDF = '11,12,13,14,15,16'

SELECT @Account_Id AS ACID
WHERE CAST(@Account_Id AS VARCHAR(6)) IN (
   CASE WHEN @Store_Id IS NULL THEN CAST(@Account_Id AS VARCHAR(6)) 
   ELSE @UDF  END 
DECLARE @INSTR as VARCHAR(MAX)
SET @INSTR = '2,3,177,'
DECLARE @SEPERATOR as VARCHAR(1)
DECLARE @SP INT
DECLARE @VALUE VARCHAR(1000)
SET @SEPERATOR = ','
CREATE TABLE #tempTab (id int not null)
WHILE PATINDEX('%' + @SEPERATOR + '%', @INSTR ) <> 0 
BEGIN
   SELECT  @SP = PATINDEX('%' + @SEPERATOR + '%',@INSTR)
   SELECT  @VALUE = LEFT(@INSTR , @SP - 1)
   SELECT  @INSTR = STUFF(@INSTR, 1, @SP, '')
   INSERT INTO #tempTab (id) VALUES (@VALUE)
END
SELECT * FROM myTable WHERE id IN **(SELECT id FROM #tempTab)**
DROP TABLE #tempTab
CREATE TABLE #Store_Id (StoreID varchar(20))

    IF @Store_Id != '0'
    BEGIN 
        INSERT INTO #Store_Id
        SELECT data FROM UDF_SplitString(@Store_Id,',')     
    END
    ELSE
        BEGIN
            INSERT INTO #Store_Id
            SELECT '0'
    END

CREATE TABLE #StoreType_Id (StoreTypeID varchar(20))

    IF @StoreType_Id != '0'
    BEGIN 
        INSERT INTO #StoreType_Id
        SELECT data FROM UDF_SplitString(@StoreType_Id,',')     
    END
    ELSE
        BEGIN
            INSERT INTO #StoreType_Id
            SELECT '0'
    END 

CREATE TABLE #Account_Id (AccountID varchar(20))

    IF @Account_Id != '0'
    BEGIN 
        INSERT INTO #Account_Id
        SELECT data FROM UDF_SplitString(@Account_Id,',')       
    END
    ELSE
        BEGIN
            INSERT INTO #Account_Id
            SELECT '0'
    END     

INSERT INTO #FinalTable(VisitDate,Merchandizer_Id,Merchandizer,MerchandizerLogin,StoreId,StoreCode,StoreName,AccountId,AccountName,
    Account_Store_Format_Id,Account_Store_Format,StoreTypeId ,StoreType ,ListId ,ListName,TimeIn ,TimeOut,PlannedDate ,Reason ,TaskCode,TotalTime)      

SELECT  Visit_Date,T.Merchandizer_ID,T.Merchandizer,Merchandizer_LoginName,STORE_ID,STORE_CODE,STORE_NAME,ACCOUNT_ID,ACCOUNT_NAME,
        Account_Store_Format_Id,Account_Store_Format,StoreType_Id, 
        StoreType,T.Listid,T.Listname,T.TimeIn,T.TimeOut,T.PlannedDate,T.Reason,TaskCode,TotalTime 
FROM [dbo].Report_RD_Coverage T
INNER JOIN #TempLocationH TL ON TL.LocationId=T.Location_Id
INNER JOIN #Store_Id on CONVERT(VARCHAR,t.Store_Id) = CASE WHEN @Store_Id = '0' THEN convert(VARCHAR,t.Store_Id) ELSE StoreID END
INNER JOIN #StoreType_Id on CONVERT(VARCHAR,t.StoreType_Id) = CASE WHEN @StoreType_Id = '0' THEN convert(VARCHAR,t.StoreType_Id) ELSE StoreTypeID END
INNER JOIN #Account_Id on CONVERT(VARCHAR,t.Account_Id) = CASE WHEN @Account_Id = '0' THEN convert(VARCHAR,t.Account_Id) ELSE AccountID END

WHERE CONVERT(Date,PDADate) Between @Start_Date AND @End_Date