0

誰かが私がここで間違っていることを知っていますか、私はリモートソースから通貨データを取得するウェブページを持っています、私はデータを取得し、ストアドプロシージャを介してSQLデータベースに挿入します。insertステートメントの前にtruncateを置くと、テーブルが切り捨てられ、最後のレコードが挿入されます。切り捨てを削除すると、すべてのレコードが挿入されます。

すなわち

truncate table tblTablename;

insert into tblTablename
(columns)
values
(data)

上記は289レコードから最後のレコードを挿入します。

切り捨てを削除すると、289レコードすべてが挿入されます。

waitforを1秒間使用してみましたが、どちらも機能しませんでした。

他に何をすべきかわからないので、助けていただければ幸いです

Webページにforeachループがあります

ジョージ

/----------------------SQLコード-----------------

  ALTER PROCEDURE [dbo].[atSP_InsertCurrency]
-- Add the parameters for the stored procedure here
@CurrencyCountry VarChar(150),
@CurrencyRate VarChar(150),
@UpdateSuccessFail  INT OUTPUT 
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
TRUNCATE TABLE [dbo].[at_CurrencyRates];

WAITFOR DELAY '000:00:01'


INSERT INTO [dbo].[at_CurrencyRates]
(
    [CurrencyCode],
    [CurrencyExchangeRate]
)
VALUES
(
    @CurrencyCountry,
    @CurrencyRate
)
IF(@@ROWCOUNT > 0)
    BEGIN
    select  @UpdateSuccessFail = '1'
    END
    ELSE
    BEGIN
    select  @UpdateSuccessFail = '0'
    END
END
4

2 に答える 2

3

TRUNCATE TABLE [dbo].[at_CurrencyRates];行ごとに挿入するためにストアド プロシージャを 289 回呼び出している場合は、ストアド プロシージャの外に移動する必要があります。

ストアド プロシージャを呼び出すたびに、テーブルからすべての行が削除されるため、挿入したばかりの行が常に 1 つだけになります。

一度に 1 つずつではなく、必要なすべての行を一度に挿入するようにストアド プロシージャを変更することをお勧めします。テーブル値パラメーターを使用して、必要なすべての行を渡すことができます。TRUNCATEその後にINSERT [dbo].[at_CurrencyRates] ... SELECT * FROM @TVP.

于 2013-01-06T13:18:42.900 に答える
1

JSONデータを取得し、 MERGEを使用してデータをSQLに一括挿入したい訪問者のために、作業ソースコードを追加すると思いました

私はプロのコーダーではありません。冗長化された後、自分自身を学んでいます。学べば学ぶほど、わからなくなることを認めなければなりません。以下のコードは、昨日マージをグーグルで何時間も費やし、他の人のブログ/投稿を読んでここで言及すべき多くのサイトがありますが、時間を割いてヒントやコツを使って問題を解決する方法についてブログに書いてくれたすべてのコーダーに感謝します。

私が提供したコードは、私のプロジェクトで問題なく動作します。

 string dbConn = ConfigurationManager.ConnectionStrings["CurrDB"].ConnectionString;
const string strCurrencyCode = "http://SomeRemoteJsonSource.com"; 

public void InsertCurrency()
        {

        WebClient wc = new WebClient();
        var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(wc.DownloadString(strCurrencyCode));

        string tmpTable = "create table #at_CurrencyCountries (CurrencyCountry varchar(150), CurrencyCountryCode varchar(4))";

        DataTable table = new DataTable();
        table.Columns.Add(new DataColumn("CurrencyCountry", typeof(string)));
        table.Columns.Add(new DataColumn("CurrencyCountryCode", typeof(string)));

        foreach (var wy in dict.AsEnumerable())
            {
            DataRow row = table.NewRow();
            row["CurrencyCountry"] = wy.Value;
            row["CurrencyCountryCode"] = wy.Key;
            table.Rows.Add(row);
            }

        using (SqlConnection cn = new SqlConnection(dbConn))
            {
            cn.Open();
            SqlCommand cmd = new SqlCommand(tmpTable, cn);
            cmd.ExecuteNonQuery();

            using (SqlBulkCopy bulk = new SqlBulkCopy(cn))
                {
                bulk.DestinationTableName = "#at_CurrencyCountries";
                bulk.WriteToServer(table);
                }
            string mergeSql = "merge into at_CurrencyCountries as Target "
                + "using #at_CurrencyCountries as Source "
                + "on "
                + "Target.CurrencyCountry=Source.CurrencyCountry "
                + "and "
    + "Target.CurrencyCountryCode = Source.CurrencyCountryCode "
                + "when matched then "
                + "update set Target.CurrencyCountryCode=Source.CurrencyCountryCode "
                + "when not matched then "
                + "insert (CurrencyCountry,CurrencyCountryCode) values (Source.CurrencyCountry, Source.CurrencyCountryCode)"
                + "WHEN NOT MATCHED BY SOURCE THEN DELETE;";
            cmd.CommandText = mergeSql;
            cmd.ExecuteNonQuery();               
            cmd.CommandText = "drop table #at_CurrencyCountries";
            cmd.ExecuteNonQuery();
            }
        }

ジョージ

于 2013-01-07T13:06:25.247 に答える