2013-11-22 241 views
0
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 
    ) 

如果@Account_Id@StoreType_Id@Store_Id是空的,應該選擇所有ACCOUNT_IDSTORETYPE_IDSTORE_ID否則基於參數值應該過濾。case語句 - SQL Server 2008中

UDF_SplitString是分裂逗號分隔的字符串的函數,它的返回值是一個表,如:

- 1 
- 2 
- 3 

我得到這個錯誤:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

+0

工作這意味着正是它說。 IN聲明顯然返回了多行。我會檢查每個IN語句並驗證它不超過1行返回。 – logixologist

+0

我猜這個人是這樣做的:'SELECT * FROM UDF_SplitString(@Account_Id,','))END'。指定在UDF_SplitString函數中返回的列名。 – logixologist

+0

UDF_SplitString是逗號分隔符的函數,它正在迴歸表中的值。像 –

回答

0

>這是我的權利solultion ........現在它的正確

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 
1

CASE必須返回標量值,因此請嘗試以下變體:

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 
     ) 
0

我嘗試了這個,並且達到了非常接近的程度,但是你必須從我發現的鏈接中做些事情。 這是我的嘗試。你需要構建的唯一東西是@udf數據。

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 

的聯繫是在 http://www.codeproject.com/Questions/473174/CreateplusArrayplusinplusSqlplusServer

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 

可以提取以粗體顯示的SQL,以及如何創建臨時表和它的數據,我希望你能得到你想要的邏輯。