テーブルに次の列があります: IdRec dataora aparat1 aparat2 .... aparat100 およびストアド プロシージャ内の次のコード:
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 dataora=@data_min)
    set @val_data_max=(
    select aparat1 from table_name
    where dataora=@data_max)
    if @val_data_max<>@val_max
    begin
    set @consum=@val_max-@val_data_min+@val_data_max
    end
    else
    begin
    set @consum=@val_data_max-@val_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 dataora=@data_min)
    set @val_data_max=(
    select aparat2 from table_name
    where dataora=@data_max)
    if @val_data_max<>@val_max
    begin
    set @consum=@val_max-@val_data_min+@val_data_max
    end
    else
    begin
    set @consum=@val_data_max-@val_data_min
    end
    select @consum
end 
aparat1、aparat2... aparat100 という名前の 100 個の列のそれぞれについて、以下同様です。
そのため、プロシージャは整数の列識別子と 2 つの日付をパラメーターとして受け取り、計算を行って値を返します。列識別子は列を識別し、列名 (「aparat」 + @id_aparat) を提供します。@id_aparat の値ごとに計算ブロックを 100 回コピーするのではなく、for ステートメントに入れるだけです。これは動的 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 @consum=@val_max-@val_data_min+@val_data_max
    end
else
    begin
        set @consum=@val_data_max-@val_data_min
    end
select @consum
END