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:这有帮助吗?