我已经尝试了两种方法,但都失败了......
BULK INSERT TEMPUSERIMPORT1357081926
FROM 'C:\uploads\19E0E1.csv'
WITH (FIELDTERMINATOR = ',',ROWTERMINATOR = '\n')
您没有使用批量加载语句的权限。
但您无法使用 Amazon RDS 启用该 SQL 角色?
所以我尝试...使用 openrowset 但它需要启用 AdHoc 查询,我无权这样做!
我已经尝试了两种方法,但都失败了......
BULK INSERT TEMPUSERIMPORT1357081926
FROM 'C:\uploads\19E0E1.csv'
WITH (FIELDTERMINATOR = ',',ROWTERMINATOR = '\n')
您没有使用批量加载语句的权限。
但您无法使用 Amazon RDS 启用该 SQL 角色?
所以我尝试...使用 openrowset 但它需要启用 AdHoc 查询,我无权这样做!
我知道这个问题真的很老,但这是我搜索批量插入到 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'
)
您可以通过前往您的 Amazon 管理控制台、导航到您的 RDS 菜单,然后创建一个数据库参数组并将临时分布式查询设置为 1,然后将此参数组附加到您的数据库实例来启用临时分布式查询。
进行这些更改后,不要忘记重新启动数据库。
以下是我的信息来源:
http://blogs.lessthandot.com/index.php/datamgmt/dbadmin/turning-on-optimize-for-ad/
希望这对您有所帮助。
我正在为像我这样想要从 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;
}
}
}