0

有谁知道我在这里做错了什么,我有一个从远程源获取货币数据的网页,我获取数据并通过存储过程将其插入 sql 数据库。如果我将截断放在插入语句的前面,它会截断表并插入最后一条记录。如果我删除截断,它会插入所有记录。

IE

truncate table tblTablename;

insert into tblTablename
(columns)
values
(data)

以上将插入 289 条记录中的最后一条记录。

如果我删除截断,则插入所有 289 条记录。

我曾尝试使用 waitfor 1 秒钟,但也没有用。

我不知道还能做什么,所以任何帮助将不胜感激

在网页中我有一个 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 次以逐行插入,则需要移出存储过程。

每次调用存储过程时,它都会从表中删除所有行,因此您总是只会得到刚刚插入的一行。

最好更改存储过程以一次性插入所有需要的行,而不是一次插入一个。您可以使用表值参数来传递所有所需的行,然后您只需要 aTRUNCATE后跟一个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 回答