5

我已经尝试了两种方法,但都失败了......

BULK INSERT TEMPUSERIMPORT1357081926 
FROM 'C:\uploads\19E0E1.csv' 
WITH (FIELDTERMINATOR = ',',ROWTERMINATOR = '\n')

您没有使用批量加载语句的权限。

但您无法使用 Amazon RDS 启用该 SQL 角色?

所以我尝试...使用 openrowset 但它需要启用 AdHoc 查询,我无权这样做!

4

3 回答 3

4

我知道这个问题真的很老,但这是我搜索批量插入到 aws sql server rds 实例时出现的第一个问题。事情发生了变化,您现在可以在将 RDS 实例与 S3 集成后执行此操作。我在这个问题上更详细地回答了这个问题。但总体要点是您使用适当的角色设置实例,将文件放在 S3 上,然后您可以使用以下命令将文件复制到 RDS:

exec msdb.dbo.rds_download_from_s3
        @s3_arn_of_file='arn:aws:s3:::bucket_name/bulk_data.csv',
        @rds_file_path='D:\S3\seed_data\data.csv',
        @overwrite_file=1;

然后BULK INSERT将工作:

FROM 'D:\S3\seed_data\data.csv'
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
)

AWS 文档

于 2020-05-05T02:05:15.557 回答
3

您可以通过前往您的 Amazon 管理控制台、导航到您的 RDS 菜单,然后创建一个数据库参数组并将临时分布式查询设置为 1,然后将此参数组附加到您的数据库实例来启用临时分布式查询。

进行这些更改后,不要忘记重新启动数据库。

以下是我的信息来源:

http://blogs.lessthandot.com/index.php/datamgmt/dbadmin/turning-on-optimize-for-ad/

希望这对您有所帮助。

于 2014-02-03T09:18:59.333 回答
0

2022

我正在为像我这样想要从 C# 快速将数据插入 RDS 的人添加

虽然 RDS 允许直接从 S3 实例批量上传 csv,但有时您只想直接从程序上传数据。

我编写了一个 C# 实用程序方法,它使用 StringBuilder 进行插入以连接语句以每次调用执行 2000 次插入,这比像 dapper 这样的 ORM 更快,每次调用执行一次插入。

这个方法应该处理 date、int、double 和 varchar 字段,但我不必将它用于字符转义或类似的事情。

//call as
FastInsert.Insert(MyDbConnection, new object[]{{someField = "someValue"}}, "my_table");


class FastInsert
{
    static int rowSize = 2000;
    internal static void Insert(IDbConnection connection, object[] data, string targetTable)
    {
        var props = data[0].GetType().GetProperties();

        var names = props.Select(x => x.Name).ToList();

        
        foreach(var batch in data.Batch(rowSize))
        {
            var sb = new StringBuilder($"insert into {targetTable} ({string.Join(",", names)})");
            string lastLine = "";

            foreach(var row in batch)
            {
                sb.Append(lastLine);
                var values = props.Select(prop => CreateSQLString(row, prop));
                lastLine = $"select '{string.Join("','", values)}' union all ";
            }

            lastLine = lastLine.Substring(0, lastLine.Length - " union all".Length) + " from dual";
            sb.Append(lastLine);
            var fullQuery = sb.ToString();
            connection.Execute(fullQuery);
        }
    }

    private static string CreateSQLString(object row, PropertyInfo prop)
    {
        var value = prop.GetValue(row);
        if (value == null) return "null";

        if (prop.PropertyType == typeof(DateTime))
        {
            return $"'{((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss")}'";
        }

        //if (prop.PropertyType == typeof(string))
        //{
            return $"'{value.ToString().Replace("'", "''")}'";
        //}
    }
}

static class Extensions
{
    public static IEnumerable<T[]> Batch<T>(this IEnumerable<T> source, int size) //split an IEnumerable into batches
    {
        T[] bucket = null;
        var count = 0;

        foreach (var item in source)
        {
            if (bucket == null)
                bucket = new T[size];

            bucket[count++] = item;

            if (count != size)
                continue;

            yield return bucket;

            bucket = null;
            count = 0;
        }

        // Return the last bucket with all remaining elements
        if (bucket != null && count > 0)
        {
            Array.Resize(ref bucket, count);
            yield return bucket;
        }
    }
}
于 2022-01-19T20:50:13.910 回答