2014-09-01 54 views
1

我正在为某些供应商代码添加一节以从临时表中的数据创建文本文件并将其发送到网络位置。临时表是#PickListSQL 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 

当我执行的是代码,我得到:

SQLSTATE = 37000,NativeError = 137
错误= [微软] [SQL Server本机客户端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

对不起,亚历克斯,我从来没有回答你的答案。是的,谢谢你......它绝对有帮助。 – 2018-01-05 15:12:17

+0

@MarkMcArdle感谢您接受它,值得等待:) – 2018-01-05 19:10:12