0

Powershell で出力を実行してレポートを生成できるように、SQL でスクリプトを作成しています。コードは次のようになります。

declare @from datetime, @to datetime
select @from=GETDATE(), @to=GETDATE()+1

SELECT ---$shape500.text='+'"'+'Assignation de Barrières-' + DATENAME(WEEKDAY,@from)+','+DATENAME(MONTH,@from)+' '+DATENAME(DAY,@from)+','+DATENAME(YEAR,@from)+'"'
+'$shape'+cast(ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+
'=$page.DrawRectangle'+'('+CAST(X1 as varchar)+','+CAST(Y1 as varchar)+','+CAST(X2 as varchar)+','+CAST(Y2 as varchar)+')'
+'$shape'+ cast(ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+'.'+'linestyle="Gantt"'
+'$shape'+ cast(ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+'.'+'textstyle="Gantt"'+case when left(arrival, 2)='AC' THEN 'Red' ELSE '' END+ CASE WHEN LEFT(Departure, 2)='AC' THEN 'Red' ELSE '' END +' '+' '
---+'$shape'+ cast(ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+'.FillStyle="Gantt"'+CASE WHEN CHARINDEX()
+'$shape'+ cast(ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+'.Text="'+case when LEN(arrival)<>0 THEN Arrival ELSE '###' END +'/'+ [ACType Iata]+'/'+ CASE WHEN LEN(Departure)<>0 THEN Departure ELSE '###' END +'"'
+'$shape'+ cast(100+ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+'=$page.DrawLine('+cast(X1 -0.5 as varchar)+','+cast(Y1 -0.03 as varchar)+','+cast(X1 +0.5 as varchar)+','+cast(Y1 -0.03 as varchar)+ ')'
+'$shape'+ cast(100+ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+'.Text="'+CONVERT(char(5), [Allocation Start Datetime], 108)+'"'
+'$shape'+ cast(100+ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+'.TextStyle="Times"'
+'$shape'+ cast(100+ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+'.LineStyle="Times"'
+'$shape'+ cast(200+ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+'=$page.DrawLine('+cast(X2 -0.1 as varchar)+','+cast(Y1 -0.03 as varchar)+','+cast(X1 +0.1 as varchar)+','+cast(Y1 -0.03 as varchar)+ ')'
+'$shape'+ cast(200+ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+'.Text="'+CONVERT(char(5), [Allocation End Datetime], 108)+'"'
+'$shape'+ cast(200+ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+'.TextStyle="Times"'
+'$shape'+ cast(200+ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+'.LineStyle="Times"'
+'$shape'+ cast(300+ROW_NUMBER()OVER(ORDER BY (SELECT 0)) as varchar)+'=$page.DrawLine('+cast(X1 as varchar)+','+cast(Y2 as varchar)+','

FROM GanttReports(default,default)

GanttReportストアド プロシージャです。出力は、次のような 1 つの大きな文字列ですべてを生成します

$shape1=$page.DrawRectangle(42.666660,6.78,58.083330,7.025)$shape1.linestyle="ガント"$shape1.textstyle="ガント" $shape1.Text="QK8718/DH1/QK8749"$shape101=$page. DrawLine(42.166660,6.75,43.166660,6.75)$shape101.Text="16:21"$shape101.TextStyle="Times"$shape101.LineStyle="Times"$shape201=$page.DrawLine(57.983330,6.75,42.766660, 6.75)$shape201.Text="17:30"$shape201.TextStyle="Times"$shape201.LineStyle="Times"$shape301=$page.DrawLine(42.666660,7.025)

しかし、私が欲しいのは別々の行です。「$shape」を区切り記号として使用して分割すると言えますか?

フォーラムで検索したときに分割機能を作成できることはわかっていますが、この場合の使用方法はわかりません。私はSQL Serverの初心者です。誰かが助けてくれれば幸いです!

4

1 に答える 1

0

GanttReportsの結果をvarchar型の変数に格納する必要があります

お気に入り

Decalre @str varchar(max)

Select @str ='$ shape' + cast(ROW_NUMBER()OVER(ORDER BY(SELECT 0))as varchar)FROM GanttReports(default、default)

次に、split関数を使用してテーブルセットを返します。以下の分割関数を使用するために、1から1000までの数値が入力されたdbo.seqテーブルを使用しました。これは、urの結果を行で返すために使用されます。

OBJECT_ID('dbo.GetNums')がNULLでない場合DROP FUNCTION dbo.GetNums; GO CREATE FUNCTION dbo.GetNums(@n AS BIGINT)RETURNS TABLE AS RETURN WITH L0 AS(SELECT 1 AS c UNION ALL SELECT 1)、L1 AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B)、L2 AS (SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B)、L3 AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B)、L4 AS(SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B )、L5 AS(SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B)、Nums AS(SELECT ROW_NUMBER()OVER(ORDER BY(SELECT NULL))AS n FROM L5)SELECT n FROM Nums WHERE n <= @ n;

行く

CREATE TABLE dbo.seq(nbr bigint)go

seqに挿入Select*from dbo.GetNums(1001)

create function [dbo]。[fn_Delimitter](@string nvarchar(MAX)、@delimiter varchar(100))はテーブルをreturnとして返します(select str = rtrim(ltrim(substring(@delimiter + @string + @delimiter、nbr + len (@delimiter)、charindex(@delimiter、@delimiter + @string + @delimiter、nbr + len(@delimiter))--nbr --len(@delimiter))))from seq where nbr <= len(@delimiter + @ string + @delimiter)-len(@delimiter)およびsubstring(@delimiter + @string + @delimiter、nbr、len(@delimiter))= @delimiter)GO

@str varchar(max)を宣言します

@str ='$ shape1 = $ page.DrawRectangle(42.666660,6.78,58.083330,7.025)$ shape1.linestyle = "Gantt" $ shape1.textstyle = "Gantt" $ shape1.Text = "QK8718 / DH1 /QK8749"$を選択しますshape101 = $ page.DrawLine(42.166660,6.75,43.166660,6.75)$ shape101.Text = "16:21" $ shape101.TextStyle = "Times" $ shape101.LineStyle = "Times" $ shape201 = $ page.DrawLine(57.983330 、6.75,42.766660,6.75)$ shape201.Text = "17:30" $ shape201.TextStyle = "Times" $ shape201.LineStyle = "Times" $ shape301 = $ page.DrawLine(42.666660,7.025) '

dbo.fn_Delimitterから*を選択します

行く

于 2012-12-30T06:33:53.547 に答える