2014-09-01 3 views
1

Я добавляю раздел к некоторому коду поставщика, чтобы создать текстовый файл из данных в таблице temp и отправить его в сетевую папку. Таблица temp: #PickListЗапрос SQL Server 2008 в текстовый файл: bcp, динамический SQL, временные таблицы и переменные таблицы

Я создал тип таблицы для переменной таблицы, поэтому я могу передать ее как параметр динамическому SQL, но это, в свою очередь, необходимо передать в bcp, который создает текстовый файл , Это то, что я до сих пор:

DECLARE @strFileLocation VARCHAR(1000) 
DECLARE @strFileName VARCHAR(1000) 
DECLARE @bcpCommand VARCHAR(8000) 
DECLARE @strSQL VARCHAR(2000) 

SET @strFileLocation = '\\phaal\FTP\LocalUser\LIFT01\inbox\' 

SET @strFileName = 'BPL' + @Job + '-' + CAST(@Suffix AS VARCHAR(20)) + '-' + 
CAST(@StartingOperNum AS VARCHAR(20)) + CAST(DATEPART(hh,GETDATE()) AS 
      VARCHAR(10)) + CAST(DATEPART(mi,GETDATE()) AS VARCHAR(10)) + 
CAST(DATEPART(ss,GETDATE()) AS VARCHAR(10)) + '.txt' 

DECLARE @tblLeanLiftData AS [dbo].[BWT_LeanLiftPickTableType] 

INSERT INTO @tblLeanLiftData (intSeq, strText) 
SELECT 0, @Job + '-' + CAST(@Suffix AS VARCHAR(20)) + '-' + 
CAST(@StartingOperNum AS VARCHAR(20)) 
UNION 
SELECT det_JobSequence, det_JobMatlItem + ':' + det_LotDescription + ',-,' + 
CAST(det_QtyToPick AS VARCHAR(20)) 
FROM #PickList 

SET @strSQL = 'EXEC sp_executesql N''SELECT strText FROM @tblLeanLiftData 
ORDER BY intSeq'', N''@tblLeanLiftData LeanLiftPickTableType READONLY'', 
            @[email protected]' 

SET @bcpCommand = 'bcp "' + @strSQL + '" queryout "' 

SET @bcpCommand = @bcpCommand + @strFileLocation + @strFileName + '" -T -c' 

EXEC master..xp_cmdshell @bcpCommand 

Когда я EXEC код, я получаю:

SQLState = 37000, NativeError = 137
Ошибка = [Microsoft] [SQL Server Native Client 10.0 ] [SQL Server] Должен объявить скалярную переменную «@tblLeanLiftData».
SQLState = 37000, NativeError = 8180
Ошибка = [Microsoft] [SQL Server Native Client 10.0] [SQL Server] Операторы не могут быть подготовлены.
NULL

Таким образом, таблица переменных по-прежнему выходит за рамки.

Я надеялся, что кто-то со свежими глазами может определить, где я поступил неправильно или альтернативный маршрут, или если это просто невозможно?

Это немного обоюдоострый меч, потому что я пробовал разные способы, и временная таблица или переменная таблицы заканчиваются из-за пределов видимости.

ответ

0

не могли бы вы попробовать?

DECLARE @strFileLocation VARCHAR(1000) 
DECLARE @strFileName VARCHAR(1000) 
DECLARE @bcpCommand VARCHAR(8000) 
DECLARE @strSQL VARCHAR(2000) 

SET @strFileLocation = '\\phaal\FTP\LocalUser\LIFT01\inbox\' 

SET @strFileName = 'BPL' + @Job + '-' + CAST(@Suffix AS VARCHAR(20)) + '-' + 
CAST(@StartingOperNum AS VARCHAR(20)) + CAST(DATEPART(hh,GETDATE()) AS 
      VARCHAR(10)) + CAST(DATEPART(mi,GETDATE()) AS VARCHAR(10)) + 
CAST(DATEPART(ss,GETDATE()) AS VARCHAR(10)) + '.txt' 

INSERT INTO [dbo].[BWT_LeanLiftPickTableType] (intSeq, strText) 
SELECT 0, @Job + '-' + CAST(@Suffix AS VARCHAR(20)) + '-' + 
CAST(@StartingOperNum AS VARCHAR(20)) 
UNION 
SELECT det_JobSequence, det_JobMatlItem + ':' + det_LotDescription + ',-,' + 
CAST(det_QtyToPick AS VARCHAR(20)) 
FROM #PickList 

SET @strSQL = 'EXEC sp_executesql N''SELECT strText FROM [dbo].[BWT_LeanLiftPickTableType] 
ORDER BY intSeq'', N''[dbo].[BWT_LeanLiftPickTableType] LeanLiftPickTableType READONLY'', 
            [dbo].[BWT_LeanLiftPickTableType]=[dbo].[BWT_LeanLiftPickTableType]' 

SET @bcpCommand = 'bcp "' + @strSQL + '" queryout "' 

SET @bcpCommand = @bcpCommand + @strFileLocation + @strFileName + '" -T -c' 

EXEC master..xp_cmdshell @bcpCommand   

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

Если намерение состояло в том, чтобы создать переменную таблицы, он должен быть назначен следующим образом:

DECLARE @strFileLocation VARCHAR(1000) 
DECLARE @strFileName VARCHAR(1000) 
DECLARE @bcpCommand VARCHAR(8000) 
DECLARE @strSQL VARCHAR(2000) 

SET @strFileLocation = '\\phaal\FTP\LocalUser\LIFT01\inbox\' 

SET @strFileName = 'BPL' + @Job + '-' + CAST(@Suffix AS VARCHAR(20)) + '-' + 
CAST(@StartingOperNum AS VARCHAR(20)) + CAST(DATEPART(hh,GETDATE()) AS 
      VARCHAR(10)) + CAST(DATEPART(mi,GETDATE()) AS VARCHAR(10)) + 
CAST(DATEPART(ss,GETDATE()) AS VARCHAR(10)) + '.txt' 

DECLARE @tblLeanLiftData TABLE (intSeq int, strText VARCHAR(MAX)) 

INSERT INTO @tblLeanLiftData (intSeq, strText) 
SELECT 0, @Job + '-' + CAST(@Suffix AS VARCHAR(20)) + '-' + 
CAST(@StartingOperNum AS VARCHAR(20)) 
UNION 
SELECT det_JobSequence, det_JobMatlItem + ':' + det_LotDescription + ',-,' + 
CAST(det_QtyToPick AS VARCHAR(20)) 
FROM #PickList 

SET @strSQL = 'EXEC sp_executesql N''SELECT strText FROM @tblLeanLiftData 
ORDER BY intSeq'', N''@tblLeanLiftData LeanLiftPickTableType READONLY'', 
            @[email protected]' 

SET @bcpCommand = 'bcp "' + @strSQL + '" queryout "' 

SET @bcpCommand = @bcpCommand + @strFileLocation + @strFileName + '" -T -c' 

EXEC master..xp_cmdshell @bcpCommand 

Я надеюсь, что этот ответ поможет вам двигаться вперед.

+1

Извините, Алекс, я никогда не отвечал на ваш ответ. Да, спасибо ... это определенно помогло. –

+0

@MarkMcArdle благодарит за него, это стоило ждать :) –

Смежные вопросы