我有在表中以下列:IdRec dataora aparat1 aparat2 .... aparat100和下面的代碼在存儲過程:動態SQL(列名變量)與聚合函數
ALTER PROCEDURE [dbo].[GetConsumRealElQRo]
@id_aparat int,
@datastart nvarchar(20),
@datastop nvarchar(20)
AS
declare
@val_max real,
@data_min datetime,
@data_max datetime,
@val_data_min real,
@val_data_max real,
@consum real
BEGIN
SET NOCOUNT ON;
if @id_aparat=1
begin
select @val_max=max(aparat1),@data_min=min(dataora),@data_max=max(dataora) from table_name where (dataora between convert(datetime,@datastart,101) and convert(datetime,@datastop,101)) and aparat1 is not null
set @val_data_min=(
select aparat1 from table_name
where [email protected]_min)
set @val_data_max=(
select aparat1 from table_name
where [email protected]_max)
if @val_data_max<>@val_max
begin
set @[email protected][email protected][email protected]_data_max
end
else
begin
set @[email protected][email protected]_data_min
end
select @consum
end
if @id_aparat=2
begin
select @val_max=max(aparat2),@data_min=min(dataora),@data_max=max(dataora) from table_name where (dataora between convert(datetime,@datastart,101) and convert(datetime,@datastop,101)) and aparat2 is not null
set @val_data_min=(
select aparat2 from table_name
where [email protected]_min)
set @val_data_max=(
select aparat2 from table_name
where [email protected]_max)
if @val_data_max<>@val_max
begin
set @[email protected][email protected][email protected]_data_max
end
else
begin
set @[email protected][email protected]_data_min
end
select @consum
end
等,爲這100列中的每一列命名爲aparat1,aparat2 ... aparat100。
所以程序接收一個整數列標識符和兩個日期作爲參數,做一些計算並返回一個值。列標識符標識列並給出列名(這是「aparat」+ @id_aparat)。 我只需要將計算塊放置在for語句中,而不是將它複製一百次,以獲得每個@id_aparat的值。凸輪這是使用動態SQL完成的嗎?
編輯:工作代碼 問題解決。對於任何感興趣的人,這裏是工作代碼:
USE [2013date]
GO
/****** Object: StoredProcedure [dbo].[GetConsumRealElQRo] Script Date: 4/18/2013 2:39:19 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetConsumRealElQRo]
@id_aparat int,
@datastart nvarchar(20),
@datastop nvarchar(20)
AS
declare
@val_max real,
@data_min datetime,
@data_max datetime,
@val_data_min real,
@val_data_max real,
@consum real
BEGIN
SET NOCOUNT ON;
declare
@aparat as nvarchar(10),
@tabel as nvarchar(50),
@query as nvarchar(1000)
set @aparat = 'aparat' + CONVERT(nvarchar(3),@id_aparat)
set @tabel = 'table_name'
set @query = 'select @val_max=max(' + @aparat + '),@data_min=min(dataora),@data_max=max(dataora) from ' + @tabel + '
where (dataora between convert(datetime,''' + @datastart + ''',101) and convert(datetime,''' + @datastop + ''',101)) and ' + @aparat + ' is not null'
--select @query
exec sp_executesql @query, N'@val_max real output, @data_min datetime output, @data_max datetime output', @val_max output, @data_min output, @data_max output
--select @val_max
--select @data_min
--select @data_max
set @query = 'set @val_data_min=(select ' + @aparat + ' from ' + @tabel + ' where dataora=''' + Convert(nvarchar(30),@data_min,121) + ''')'
--select @query
exec sp_executesql @query, N'@val_data_min real output', @val_data_min output
--select @val_data_min
set @query = 'set @val_data_max=(select ' + @aparat + ' from ' + @tabel + ' where dataora=''' + Convert(nvarchar(30),@data_max,121) + ''')'
--select @query
exec sp_executesql @query, N'@val_data_max real output', @val_data_max output
--select @val_data_max
if @val_data_max<>@val_max
begin
set @[email protected][email protected][email protected]_data_max
end
else
begin
set @[email protected][email protected]_data_min
end
select @consum
END
無的,這是工作。 – user2285985
給我樣本表架構和數據.. –