如何在子查询中传递多个值

时间:2013-08-04 12:55:14

标签: sql-server

我有一个这样的存储过程:

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

执行此操作时会出现如下错误:

  

子查询返回的值超过1。这是不允许的   子查询跟随=,!=,<,< =,>,> =或当子查询用作   表达。

我如何在子查询中传递超过1个值?

2 个答案:

答案 0 :(得分:2)

我说你的问题在这里:

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

你正在尝试从那里返回的未知数量的行中形成一个字符串。

你可以制作字符串的那一部分。

答案 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