繁体   English   中英

SQL Server 2008查询到文本文件:bcp,动态SQL,临时表和表变量

[英]SQL Server 2008 query into text file: bcp, dynamic SQL, temp tables and table variables

我在一些供应商代码中添加了一个部分,以便根据临时表中的数据创建文本文件并将其发送到网络位置。 临时表是#PickList

我已经为表变量创建了一个表类型,因此我可以将其作为参数传递给动态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'',
                                  @tblLeanLiftData=@tblLeanLiftData'

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

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

EXEC master..xp_cmdshell @bcpCommand

当我执行代码时,我得到:

SQLState = 37000,NativeError = 137
错误= [Microsoft] [SQL Server本机客户端10.0] [SQL Server]必须声明标量变量“ @tblLeanLiftData”。
SQLState = 37000,NativeError = 8180
错误= [Microsoft] [SQL Server本机客户端10.0] [SQL Server]声明无法准备。
空值

因此,表变量仍然超出范围。

我希望有个新鲜的眼睛的人可以发现我出了问题的地方或替代路线,或者这是否不可能呢?

这有点像一把双刃剑,因为我尝试了各种方法,而临时表或表变量最终都超出了范围。

你可以试试这个吗?

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'',
                                  @tblLeanLiftData=@tblLeanLiftData'

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

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

EXEC master..xp_cmdshell @bcpCommand

希望这个答案能帮助您前进。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM