2

だから私はいくつかのことをするように頼まれました....(月曜日の朝です、そして何らかの理由でこのすべては私が説明するのが本当に難しいことが判明しているので、私は私のコードの多くを投稿しようとしています;ごめんなさい)ああ-テーブルのアイデアはとどまらなければなりません。他のものは変更できますが、このテーブルと解析されたフィールドのアイデアは私のアイデアではありませんでしたが、実行して作業を行うのは私の責任です。

編集:申し訳ありませんが、投稿が長いです。私は全体を通していくつかの可能な解決策を提案しますが、私の問題は最終的にすべてが動的に定義されたテーブル/テーブル変数で何か(sp、view、function、anything ...)から返される方法です。投稿全体を読んでください...

まず、テーブルが必要でした。

CREATE TABLE TICKET_INFORMATION ( 
    TICKET_INFO_ID INT IDENTITY(1,1) NOT NULL, 
    TICKET_TYPE INT, 
    TARGET_ID INT, 
    TARGET_NAME VARCHAR(100), 
    INFORMATION VARCHAR(MAX),   
    TIME_STAMP DATETIME DEFAULT GETUTCDATE()
)

-- insert this row for testing...  
INSERT INTO TICKET_INFORMATION (TICKET_TYPE, TARGET_ID, TARGET_NAME, INFORMATION) VALUES (1,1,'RT_ID','IF_ID,int=1&IF_ID,int=2&OTHER,varchar(10)=val,ue3&OTHER,varchar(10)=val,ue4')

[情報]列には、テーブルに解析する必要のあるデータが含まれています。これは私が問題を抱えているところです。結果のテーブルでは、Target_Nameは、結果のテーブルの各行の値としてTarget_IDを保持する列になる必要があります。

解析する必要のある文字列は次の形式です。 @var_name1,@var_datatype1=@var_value1&@var_name2,@var_datatype2=@var_value2&@var_name3,@var_datatype3=@var_value3

そして、結果として(テーブルまたはテーブル変数で)最終的に必要なもの:

RT_ID       IF_ID       OTHER
1           1           val,ue3
1           2           val,ue3
1           1           val,ue4
1           2           val,ue4

そして、私は結果に参加できる必要があります。最初は、これをテーブル変数を返す関数にするつもりでしたが、何らかの理由で、実際のテーブル変数に取り込む方法がわかりません。文字列を解析するものはすべて、クエリで直接使用できる必要があるため、ストアドプロシージャを使用するのが本当に正しいとは思いません。

これは、情報文字列を解析するコードです...一時テーブルに返されます。結局、これは情報文字列かID番号か何かのいずれかを渡す必要があります...何でも構いません。または、どういうわけか、ticket_informationテーブルを使用してビューに表示することもできます。

-- create/empty temp table for var_name, var_type and var_value fields 
if OBJECT_ID('tempdb..#temp') is not null drop table #temp
create table #temp (row int identity(1,1), var_name varchar(max), var_type varchar(30), var_value varchar(max)) 

-- just setting stuff up
declare @target_name varchar(max), @target_id varchar(max), @info varchar(max)
    set @target_name = (select target_name from ticket_information where ticket_info_id = 1) 
    set @target_id = (select target_id from ticket_information where ticket_info_id = 1) 
    set @info = (select information from ticket_information where ticket_info_id = 1) 
    --print @info

-- some of these variables are re-used later    
declare @col_type varchar(20), @query varchar(max), @select as varchar(max) 
set @query = 'select ' + @target_id + ' as ' + @target_name + ' into #target; '
set @select = 'select * into ##global_temp from #target'  


declare @var_name varchar(100), @var_type varchar(100), @var_value varchar(100) 
declare @comma_pos int, @equal_pos int, @amp_pos int        
    set @comma_pos = 1
    set @equal_pos = 1
    set @amp_pos   = 0 

-- while loop to parse the string into a table 
while @amp_pos < len(@info) begin  

    -- get new comma position
    set @comma_pos  = charindex(',',@info,@amp_pos+1)   

    -- get new equal position
    set @equal_pos  = charindex('=',@info,@amp_pos+1)   

    -- set stuff that is going into the table 
    set @var_name   = substring(@info,@amp_pos+1,@comma_pos-@amp_pos-1)  
    set @var_type   = substring(@info,@comma_pos+1,@equal_pos-@comma_pos-1) 

    -- get new ampersand position 
    set @amp_pos    = charindex('&',@info,@amp_pos+1) 
    if @amp_pos=0   or @amp_pos<@equal_pos set @amp_pos = len(@info)+1

    -- set last variable for insert into table 
    set @var_value  = substring(@info,@equal_pos+1,@amp_pos-@equal_pos-1)

    -- put stuff into the temp table 
    insert into #temp (var_name, var_type, var_value) values (@var_name, @var_type, @var_value) 

    -- is this a new field?
    if ((select count(*) from #temp where var_name = (@var_name)) = 1) begin 
        set @query = @query + ' create table #' + @var_name + '_temp (' + @var_name + ' ' + @var_type + '); '    
        set @select = @select + ', #' + @var_name + '_temp '
    end 

    set @query = @query + ' insert into #' + @var_name + '_temp values (''' + @var_value + '''); '   
end 


if OBJECT_ID('tempdb..##global_temp') is not null drop table ##global_temp
exec (@query + @select) 

--select @query
--select @select 

select * from ##global_temp 

わかった。したがって、必要な結果は##global_tempになります。関数(または何か)から返すことができるものにそれらすべてをどのように入れるのですか?または、execステートメントからより有用なものが返されるようにすることはできますか?結局、解析された文字列の結果は、結合して使用できるテーブルにある必要があります...理想的にはこれはビューでしたが、実行する必要のあるすべての処理ではできないと思いますその情報文字列。

アイデア?

ありがとう!

編集: まだこれに対する答えを探しています。テーブル変数を返す関数が欲しいのですが、結果をテーブル変数に取り込む方法がわかりません。結果は現在、グローバル一時テーブルにあります。コードの動的な部分でテーブル変数を定義し、それが魔法のように戻ってくるとしたら、それは機能しますか?または、最初にテーブル変数の列を定義せずに、グローバル一時テーブルからテーブル変数を選択することはできますか?または、動的部分を実行するときにテーブル変数を作成できますか?全体的な問題は、最終結果の列が動的であるためです.......そう.....私が抱えている問題をどのように明確にできるかわかりません。 テーブルを返す関数が適切なルートである場合、関数から動的な列定義を持つテーブル変数を返すための例として、コードまたはリンクを提供してもらえますか?Plz、thnx。

4

2 に答える 2

2

テーブル値関数を使用できます。これにより、要求したとおりに結合するテーブルとして結果を返すことができます。

CREATE FUNCTION dbo.GET_TICKET_INFORMATION (... some parameters... )
RETURNS @TICKET_INFORMATION TABLE 
( 
TICKET_INFO_ID INT IDENTITY(1,1) NOT NULL, 
TICKET_TYPE INT, 
TARGET_ID INT, 
TARGET_NAME VARCHAR(100), 
INFORMATION VARCHAR(MAX),   
TIME_STAMP DATETIME DEFAULT GETUTCDATE()
)
 AS 
...
于 2012-09-24T17:27:17.947 に答える
1

動的列定義を持つテーブルを返すためにストアドプロシージャを使用しました

グローバルテーブルの動的な名前を生成しました:

declare @sp varchar(3)
set @sp = cast( @@spid as varchar(3) )

if object_id ( N'tempdb.dbo.#Periods' ) is not null
    drop table #Periods      
if object_id ( N'tempdb.dbo.##Result' + @sp ) is not null
    execute ( 'drop table ##Result' + @sp )

私は確率表のspを持っています:

create table #Periods
(
    [PERIOD_NUM]    int
    ,[START_DATE]   datetime
    ,[END_DATE]     datetime   
)

insert into #Periods
exec GET_PERIODS_TABLE_SP @pFromDate, @pToDate, @pPeriodType, 0

結果テーブルの一部のフィールドは動的です。

select @PeriodCount = ...

declare @PeriodsScript varchar(max)  

set @PeriodsScript = ''
set @i = 1

while @i <= @PeriodCount
begin
    set @PeriodsScript = @PeriodsScript + ',PERIOD' + cast (@i as varchar(3))

    set @i = @i + 1
end

生成され、## Resultに挿入されたデータ:

declare @script varchar(max)

set @script = 'create table ##Result' + @sp +
            '(ROW_NUM int'+
            ',BRANCH_ID int' +
            ',PARAM_NAME varchar(25)' +
            @PeriodsScript + ')'       

execute ( @script )

execute(
            'insert into ##Result' + @sp + '( ROW_NUM, BRANCH_ID, NOM_SIZE_ID, PARAM_NAME )' +
            'select ( row_number() over( order by BRANCH_ID, NOM_SIZE_ID ) - 1 ) * 3 + 1' +
            '        ,BRANCH_ID' +
            '        ,NOM_SIZE_ID' +
            '        ,''Min.price''' +
            '  from ( ' +
            '        select distinct BRANCH_ID' +
            '                ,NOM_SIZE_ID' +
            '          from ##ResultNomSizePrices' + @sp +
            '        ) as t'
            )

最後に、結果テーブルから選択します。

set @script = 
            'select distinct gb.TINY_NAME'+
            '        ,r.GROUP_NAME_1 as group1'+
            '        ,r.GROUP_NAME_2 as group2'+
            '        ,r.GROUP_NAME_3 as group3'+
            '        ,r.PARAM_NAME'+
            '        ,r.ROW_NUM'+
            @PeriodsScript +
            '  from ##Result' + @sp + ' as r'+
            ' inner join dbo.GD_BRANCHES as gb'+
            '    on r.BRANCH_ID = gb.BRANCH_ID'+
            ' order by gb.TINY_NAME'+
            '        ,r.GROUP_NAME_1'+
            '        ,r.GROUP_NAME_2'+
            '        ,r.GROUP_NAME_3'+
            '        ,r.ROW_NUM'

 execute ( @script )

ps sry for my english

于 2012-09-25T07:18:43.373 に答える