В SQL, как я могу преобразовать VARCHAR в STRING? - PullRequest
3 голосов
/ 24 июня 2011

Я пытаюсь выполнить операцию BULK INSERT на SQL Server 2008 R2, используя параметр. Однако у меня возникли проблемы, связанные с тем, что функция ожидает STRING, когда я передаю ей VARCHAR. Мой SQL ниже.

DECLARE @filepath VARCHAR(30)
DECLARE @current_symbol VARCHAR(30)

DECLARE symbol_cursor CURSOR FOR
SELECT symbol FROM stocks.dbo.description WHERE 1=1

OPEN symbol_cursor;

FETCH NEXT FROM symbol_cursor INTO @current_symbol

WHILE @current_symbol is not null
BEGIN
SET @filepath = 'C:\Users\stkerr\Desktop\stockPricing\' + @current_symbol + '.prices'
BULK
INSERT stocks.dbo.pricing
FROM @filepath
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR=',',
    ROWTERMINATOR='\n',
    ORDER   ( [date], [open], high, low, [close],volume),
        ERRORFILE='C:\Users\stkerr\errors.txt'.
)

FETCH NEXT FROM symbol_cursor INTO @current_symbol
END 
GO

Проблема появляется, когда я выполняю инструкцию SET @filepath.

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 24 июня 2011

Чтобы указать файл в переменной (@filepath) для BULK INSERT, вам необходимо создать динамический TSQL и выполнить его.

например,

DECLARE @str_command nvarchar(150)
SET @str_command = 'BULK INSERT [Customer_Sample] FROM ''' + @SourceFilePath + 
                   ''' WITH (formatfile = ''' + @FormatFilePath + 
                   ''', firstrow =' + cast(@RowNumber as nvarchar) + ')'
EXEC SP_EXECUTESQL @str_command
2 голосов
/ 24 июня 2011

нет типа "string" в sql.Если у вас возникли проблемы с оператором set, скорее всего, вы дали ему максимальную длину 30 символов, а ваш текст длиннее.

, если From @filepath дает вампроблема в том, что массовая вставка не будет принимать переменную в операторе from.

в целом, я думаю, что вы можете выполнить массовую вставку через динамический sql.создайте оператор в переменной и затем выполните exec ().

1 голос
/ 24 июня 2011

Я согласен с Митчем Уитом, динамический SQL - это путь. У вас также есть пара других вещей, которые нужно решить, я думаю. Ваш путь к файлу должен быть заключен в кавычки, и я думаю, что после имени файла ошибки может быть случайная точка. Попробуйте что-то вроде:

DECLARE @filepath VARCHAR(30)
DECLARE @current_symbol VARCHAR(30)
DECLARE @sql VARCHAR(8000)

SET QUOTED_IDENTIFIER OFF

SET @current_symbol = (SELECT "tst") 

IF @current_symbol is not null
BEGIN
SET @filepath = "C:\Users\stkerr\Desktop\stockPricing\" + @current_symbol + ".prices"

SET @sql = "BULK INSERT stocks.dbo.pricing FROM '" + @filepath + "' WITH ( FIRSTROW = 2, FIELDTERMINATOR=',', ROWTERMINATOR='\n', ORDER   ( [date], [open], high, low, [close],volume), ERRORFILE='C:\Users\stkerr\Desktop\stockPricing\errors.txt') "
END 

PRINT @SQL -- Check out the result of this, and try and run it by itself.

EXEC (@SQL)

Удачи. Обратите внимание, что мой пример не работает с динамическим SQL, как предложил Митч. Сначала запустите его, а затем снова примените на примере Митча.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...