2013-08-04 2 views
1

У меня есть хранимая процедура, как это:как передать более одного значения в подзапросом

ALTER procedure [dbo].[ParkingDeatailsReportnew] 
    @startdate nvarchar(100), 
    @enddate nvarchar(100) 
as 
begin 
    DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) 

    select @cols = 
     STUFF((SELECT distinct ',' + QUOTENAME(Vtype) from VType_tbl FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

    set @query = 
    'SELECT Date, ' + @cols + ' 
    from (select v.Vtype, convert(date, dtime) as Date 
    from Transaction_tbl t inner join VType_tbl v on t.vtid = v.vtid where dtime between ''' + @startdate + ''' and ''' + @enddate + 
    '''and locid IN ' + (select CAST(l.Locid as varchar(max)) from Location_tbl l) 
+ ' ) d pivot (count(Vtype)  for Vtype in (' + @cols + ') ) p ' 

    execute(@query) 
end 

При выполнении этого я получаю сообщение об ошибке, как это:

Subquery вернулся более чем на 1 значение. Это недопустимо, если подзапрос следует за =,! =, <, < =,>,> = или когда подзапрос используется как выражение.

Как я могу передать более одного значения в моем подзапросе?

ответ

1

Попробуйте один -

ALTER PROCEDURE [dbo].[ParkingDeatailsReportnew] 

    @startdate NVARCHAR(100), 
    @enddate NVARCHAR(100) 

AS BEGIN 

    DECLARE 
      @cols AS NVARCHAR(MAX) 
     , @query AS NVARCHAR(MAX) 

    SELECT @cols = STUFF((
     SELECT DISTINCT ',' + QUOTENAME(Vtype) 
     FROM dbo.VType_tbl 
     FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

    SET @query = 
    'SELECT Date, ' + @cols + ' 
    from ( 
      select v.Vtype, convert(date, dtime) as Date 
      from Transaction_tbl t 
      join VType_tbl v on t.vtid = v.vtid 
      where dtime between ''' + @startdate + ''' and ''' + @enddate + ''' 
       and locid IN (SELECT l.Locid FROM dbo.Location_tbl l) 
    ) d pivot (count(Vtype) for Vtype in (' + @cols + ') ) p ' 

    EXEC sys.sp_executesql @query 

END 
+0

yes..sir ,, это работало нормально для меня – user2648161

+0

Добро пожаловать @ user2648161 :) – Devart

2

Я бы сказал, что ваша проблема лежит здесь:

(select CAST(l.Locid as varchar(max)) from Location_tbl l) 

Вы пытаетесь сформировать строку из неизвестного количества строк, возвращенных из этого.

Вы можете просто сделать эту часть строки.

+0

InstEd этого кода, что код я должен дать – user2648161

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