используя Массовую вставку для вставки данных на SQL-сервер с использованием C # [duplicate]

Вот общий метод расширения LINQ, который не создает дополнительную копию списка:

public static void Sort<T,U>(this List<T> list, Func<T, U> expression)
    where U : IComparable<U>
{
    list.Sort((x, y) => expression.Invoke(x).CompareTo(expression.Invoke(y)));
}

Чтобы использовать его:

myList.Sort(x=> x.myProperty);

Недавно я построил этот дополнительный один, который принимает ICompare<U>, так что вы можете настроить сравнение. Это пригодилось, когда мне нужно было сделать естественную сортировку строки:

public static void Sort<T, U>(this List<T> list, Func<T, U> expression, IComparer<U> comparer)
    where U : IComparable<U>
{    
    list.Sort((x, y) => comparer.Compare(expression.Invoke(x), expression.Invoke(y)));
}
13
задан Contango 16 February 2011 в 17:22
поделиться

6 ответов

Как я знаю, в строке требуется только буквальная строка. В этом случае вам нужно написать динамический запрос для использования массовой вставки

declare @q nvarchar(MAX);
set @q=
    'BULK INSERT [TStagingTable]
    FROM '+char(39)+@CSVfile+char(39)+'
    WITH
    (
    FIELDTERMINATOR = '','',
    ROWTERMINATOR = ''\n'',
    FIRSTROW = 1  
    )'
exec(@q)
14
ответ дан Contango 18 August 2018 в 22:55
поделиться
  • 1
    Блестяще, это сработало всего с несколькими модификациями. Кажется, что это не сработало, если я вообще использовал любые двойные кавычки в запросе, ваше решение в значительной степени идеально подходит. – Contango 16 February 2011 в 18:23
  • 2
    Что такое SQL Injection? – user441365 17 July 2017 в 13:49
  • 3

Требуется строковый литерал.

http://msdn.microsoft.com/en-us/library/ms188365.aspx

Вы может использовать динамический sql для генерации строкового литерала.

1
ответ дан dotjoe 18 August 2018 в 22:55
поделиться

Вы пытались использовать динамический SQL?

SET @SQL = "BULK INSERT TmpStList FROM '"+@PathFileName+"' WITH (FIELDTERMINATOR = '"",""') "

, а затем

EXEC(@SQL)

Ref .: http://www.sqlteam.com/article/ используя навалочных-вставки к нагрузке-а-текстовый файл

2
ответ дан Jason 18 August 2018 в 22:55
поделиться

вы должны участвовать в построении строк и amp; то вызов EXEC () или sp_executesql BOL имеет пример:

DECLARE @bulk_cmd varchar(1000)
SET @bulk_cmd = 'BULK INSERT AdventureWorks2008R2.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>'' 
WITH (ROWTERMINATOR = '''+CHAR(10)+''')'
EXEC(@bulk_cmd)
1
ответ дан Nick Kavadias 18 August 2018 в 22:55
поделиться

В большинстве случаев переменная, которую я ищу в имени файла, - это дата, и она отлично работает для массовой вставки файлов с датой, для использования, например, в ежедневной работе. Изменение в соответствии с вашими потребностями, формат даты, имя таблицы, путь к файлу, имя файла и разделители.

    DECLARE @DT VARCHAR (10)
    DECLARE @INSERT VARCHAR (1000)
    SET @DT = (CONVERT(VARCHAR(10),GETDATE()-1,120))
    SET @INSERT = 'BULK INSERT dbo.table FROM ''C:\FOLDER\FILE'+@DT+'.txt'''+' WITH  (FIRSTROW=2, FIELDTERMINATOR=''\t'', ROWTERMINATOR=''\n'')'
    EXEC (@INSERT);
0
ответ дан s6a6n6d6m6a6n 18 August 2018 в 22:55
поделиться

Можете ли вы попробовать FROM ' + @CSVfile + '

1
ответ дан Sachin Shanbhag 18 August 2018 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: