Sql 执行存储过程时用现有列替换列

Sql 执行存储过程时用现有列替换列,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有这样一个存储过程: ALTER PROCEDURE [dbo].[ParkingSummary] @locid INTEGER, @startdate NVARCHAR(100), @enddate NVARCHAR(100) AS BEGIN DECLARE @cols AS NVARCHAR(MAX) ,@query AS NVARCHAR(MAX) SELECT @cols = STUFF((

我有这样一个存储过程:

ALTER PROCEDURE [dbo].[ParkingSummary] 

    @locid INTEGER, 
    @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  ' + @cols + '  from 
 ( select Vtype from Transaction_tbl t inner join VType_tbl v on t.vtid = v.vtid
where dtime between ''' + @startdate + ''' and ''' + @enddate + '''  and locid =  ' + 
    CAST(@locid AS VARCHAR(MAX)) + ' and Status >= 5  ) d
      pivot (  count(Vtype)  for Vtype in (' + @cols + ') ) p '

    EXECUTE (@query)
END
Emaar Staff Lost Ticket Normal      VIP         VVIP
----------- ----------- ----------- ----------- -----------
0           0           455         0           0
0           0           2537        1831        0
   Emaar Staff Lost Ticket Normal      VIP         VVIP
-----------    ----------- ----------- ----------- -----------
AddressHotel            0           455         0           0
Fashionavenu          0           2537        1831        0
我的输出是这样的:

ALTER PROCEDURE [dbo].[ParkingSummary] 

    @locid INTEGER, 
    @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  ' + @cols + '  from 
 ( select Vtype from Transaction_tbl t inner join VType_tbl v on t.vtid = v.vtid
where dtime between ''' + @startdate + ''' and ''' + @enddate + '''  and locid =  ' + 
    CAST(@locid AS VARCHAR(MAX)) + ' and Status >= 5  ) d
      pivot (  count(Vtype)  for Vtype in (' + @cols + ') ) p '

    EXECUTE (@query)
END
Emaar Staff Lost Ticket Normal      VIP         VVIP
----------- ----------- ----------- ----------- -----------
0           0           455         0           0
0           0           2537        1831        0
   Emaar Staff Lost Ticket Normal      VIP         VVIP
-----------    ----------- ----------- ----------- -----------
AddressHotel            0           455         0           0
Fashionavenu          0           2537        1831        0
我还有一个表名位置,我也想显示位置。所以我像这样重新编写查询以获取位置名

ALTER PROCEDURE [dbo].[ParkingSummary] 

    @locid INTEGER,
    @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 LocName ' + @cols + '  from 
 ( select  l.LocName, Vtype from Transaction_tbl t inner join VType_tbl v on t.vtid = v.vtid
 join dbo.Location_tbl l on t.locid=l.Locid 
where dtime between ''' + @startdate + ''' and ''' + @enddate + '''   and Status >= 5  ) d
      pivot (  count(Vtype)  for Vtype in (' + @cols + ') ) p '
    EXECUTE (@query)

END
所以我的计划是这样的:

ALTER PROCEDURE [dbo].[ParkingSummary] 

    @locid INTEGER, 
    @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  ' + @cols + '  from 
 ( select Vtype from Transaction_tbl t inner join VType_tbl v on t.vtid = v.vtid
where dtime between ''' + @startdate + ''' and ''' + @enddate + '''  and locid =  ' + 
    CAST(@locid AS VARCHAR(MAX)) + ' and Status >= 5  ) d
      pivot (  count(Vtype)  for Vtype in (' + @cols + ') ) p '

    EXECUTE (@query)
END
Emaar Staff Lost Ticket Normal      VIP         VVIP
----------- ----------- ----------- ----------- -----------
0           0           455         0           0
0           0           2537        1831        0
   Emaar Staff Lost Ticket Normal      VIP         VVIP
-----------    ----------- ----------- ----------- -----------
AddressHotel            0           455         0           0
Fashionavenu          0           2537        1831        0
我的位置名替换emaarstaff结果

Location1name          Emaar Staff  Lost Ticket  Normal      VIP         VVIP
-----------    ----------- ----------- ----------- --------------------------
AddressHotel            0           455         0           0           10
Fashionavenu            0           2537        1831        0           10

你错过了“,”。试试这个:

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 LocName, ' + @cols + '  from 
 ( select  l.LocName, Vtype from Transaction_tbl t inner join VType_tbl v on t.vtid = v.vtid
 join dbo.Location_tbl l on t.locid=l.Locid 
where dtime between ''' + @startdate + ''' and ''' + @enddate + '''   and Status >= 5  ) d
      pivot (  count(Vtype)  for Vtype in (' + @cols + ') ) p '
    EXECUTE (@query)

END

不明白您想问什么?先生,我想在结果中获取位置名。因此,我尝试在第二次查询中传递locaname。因此,位置名即将出现。但这将出现在EmarStaff结果列中指定查询中第一个选择列表中的所有列名。@user2648161:这有帮助吗?