0

私はこのようなSQLファイルを持っています(明らかに本物はもう少し長く、実際には何かをしています:))

DECLARE @Mandatory int = 0 
DECLARE @Fish int = 3 

DECLARE @InitialPriceID int
if @Mandatory= 0
    begin
    select @InitialPriceID = priceID from Fishes where FishID = @Fish
    end

「必須」と「魚」の値のファイルがあります

  Mandatory,Fish
     1,3
     0,4
     1,4
     1,3
     1,7

DBO がデータベースに対して実行する SQL ファイルを生成するプログラムを作成する必要があります。しかし、私は問題にアプローチする方法がよくわかりません...

乾杯

4

3 に答える 3

1

C#などで物事を過度に単純化するリスクがありますが、文字列処理アプローチを使用できます。

class Program
{
    static void Main(string[] args)
    {
        var sb = new StringBuilder();

        foreach(var line in File.ReadLines(@"c:\myfile.csv"))
        {
            string[] values = line.Split(',');

            int mandatory = Int32.Parse(values[0]);
            int fish = Int32.Parse(values[1]);

            sb.AppendLine(new Foo(mandatory, fish).ToString());
        }

        File.WriteAllText("@c:\myfile.sql", sb.ToString());
    }

    private sealed class Foo
    {
        public Foo(int mandatory, int fish)
        {
            this.Mandatory = mandatory;
            this.Fish = fish;
        }

        public int Mandatory { get; private set; }
        public int Fish { get; set; }

        public override string ToString()
        {
            return String.Format(@"DECLARE @Mandatory int = {0}
DECLARE @Fish int = {1}

DECLARE @InitialPriceID int
if @Mandatory= 
begin
select @InitialPriceID = priceID from Fishes where FishID = @Fish
end
", this.Mandatory, this.Fish);
        }
    }
}
于 2012-08-15T08:25:12.947 に答える
1

通常、セット ベースのソリューションを優先する必要があります。完全なソリューションがどのようになるかはわかりませんが、最初から次のように述べています。

declare @Values table (Mandatory int,Fish int)
insert into @Values(Mandatory,Fish) values
(1,3),
(0,4),
(1,4),
(1,3),
(1,7),

;with Prices as (
    select
        Mandatory,
        Fish,
        CASE
            WHEN Mandatory = 0 THEN f.PriceID
            ELSE 55 /* Calculation for Mandatory = 1? */
        END as InitialPriceID
    from
        @Values v
            left join /* Or inner join? */
        Fishes f
            on
                v.Fish = f.Fish
) select * from Prices

各計算を「ループスルー」しようとするのではなく、一度にすべての結果を計算することを目指す必要があります。SQL はこの方法でうまく機能します。

于 2012-08-15T08:22:52.920 に答える
1

t-sqlを介してテキストファイルから読み取る方法に関する多くの記事があります。SOの「テキストファイルを開いて読み取るストアドプロシージャ」を確認し、入力ファイルの形式をxmlに変更できる場合は、確認できますSQL SERVER – T-SQL を使用して XML ファイルを読み取る簡単な例

于 2012-08-15T08:25:50.437 に答える