Вот общий метод расширения 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)));
}
Как я знаю, в строке требуется только буквальная строка. В этом случае вам нужно написать динамический запрос для использования массовой вставки
declare @q nvarchar(MAX);
set @q=
'BULK INSERT [TStagingTable]
FROM '+char(39)+@CSVfile+char(39)+'
WITH
(
FIELDTERMINATOR = '','',
ROWTERMINATOR = ''\n'',
FIRSTROW = 1
)'
exec(@q)
Требуется строковый литерал.
http://msdn.microsoft.com/en-us/library/ms188365.aspx
Вы может использовать динамический sql для генерации строкового литерала.
Вы пытались использовать динамический SQL?
SET @SQL = "BULK INSERT TmpStList FROM '"+@PathFileName+"' WITH (FIELDTERMINATOR = '"",""') "
, а затем
EXEC(@SQL)
Ref .: http://www.sqlteam.com/article/ используя навалочных-вставки к нагрузке-а-текстовый файл
вы должны участвовать в построении строк и 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)
В большинстве случаев переменная, которую я ищу в имени файла, - это дата, и она отлично работает для массовой вставки файлов с датой, для использования, например, в ежедневной работе. Изменение в соответствии с вашими потребностями, формат даты, имя таблицы, путь к файлу, имя файла и разделители.
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);
Можете ли вы попробовать FROM ' + @CSVfile + '