だから私はいくつかのことをするように頼まれました....(月曜日の朝です、そして何らかの理由でこのすべては私が説明するのが本当に難しいことが判明しているので、私は私のコードの多くを投稿しようとしています;ごめんなさい)ああ-テーブルのアイデアはとどまらなければなりません。他のものは変更できますが、このテーブルと解析されたフィールドのアイデアは私のアイデアではありませんでしたが、実行して作業を行うのは私の責任です。
編集:申し訳ありませんが、投稿が長いです。私は全体を通していくつかの可能な解決策を提案しますが、私の問題は最終的にすべてが動的に定義されたテーブル/テーブル変数で何か(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。