2013-11-22 3 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_ID, STORETYPE_ID и STORE_ID в противном случае на основе значения параметра следует фильтровать.сазе в котором пункт - 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 выделены жирным шрифтом и логики, как создать временную таблицу и ее данные, и я надеюсь, что вы получите то, что вы хотите.

Смежные вопросы