2015-07-20 58 views
2

我在SQL中为我的bcp命令构建查询。 当执行我有以下错误的语句:SQL中用于bcp命令的查询语法有些问题

Conversion failed when converting the varchar value 'SELECT 'Transaction Unique ID','Transaction Date', 'Person Unique ID' UNION ALL SELECT NULL AS 'Transaction Unique ID', CONVERT(VARCHAR(10),CONVERT(DATETIME,Date,1),101) AS ' Transaction Date', NULL AS 'Person Unique ID' FROM tblChromeRiverInitData WHERE YYYYMM = ' to data type int.

这是我的BCP命令的语法:

DECLARE @query VARCHAR(2000) 
DECLARE @bcpCommand VARCHAR(1024) 
DECLARE @sharedDevFolder VARCHAR(500) 
DECLARE @fileName VARCHAR(200) 
DECLARE @environment VARCHAR(5) 
DECLARE @customerCode VARCHAR(5) 
DECLARE @parserConfig VARCHAR(5) 
DECLARE @bucketAssign VARCHAR(10) 
DECLARE @dateFormat VARCHAR(15) 
DECLARE @input VARCHAR(15) 
DECLARE @RC int 

SET @sharedDevFolder = '\\REMOTE_SERVER\MyDirectory\' 
SET @input = 201507 
SET @fileName = 'Transaction-' + 
       @environment + '-' + 
       @customerCode + '-' + 
       @parserConfig + '-' + 
       @bucketAssign + '-' + 
       @dateFormat + '.txt' 

SET @query = 
    'SELECT ''Transaction Unique ID'',''Transaction Date'', ''Person Unique ID'' UNION ALL SELECT NULL AS ''Transaction Unique ID'', CONVERT(VARCHAR(10),CONVERT(DATETIME,Date,1),101) AS '' Transaction Date'', NULL AS ''Person Unique ID'' FROM tblChromeRiverInitData WHERE YYYYMM = ' + CAST(@input as VARCHAR(10)) 

SET @bcpCommand = 'bcp "' + @query + '" queryout "' 
set @bcpCommand = @bcpCommand + @sharedDevFolder + @fileName + '" -c -T -t^| -r\n' 

EXEC @RC = master..xp_cmdshell @bcpCommand 

我不知道什么是错的。

执行时,下面的查询打印:

SELECT 'Transaction Unique ID','Transaction Date', 'Person Unique ID' UNION ALL SELECT NULL AS 'Transaction Unique ID', CONVERT(VARCHAR(10),CONVERT(DATETIME,Date,1),101) AS 'Transaction Date', NULL AS 'Person Unique ID' FROM tblChromeRiverInitData WHERE YYYYMM = '201507' 

我一直在试图解决它有时已经和它真的烦我。

你能解释我做错了什么,如果可能的话,提供给我正确的做法吗?

+0

在这个查询的哪一行你会得到那个错误信息?你可以验证这是正在执行的* actual *查询(除了可能的sharedDevFolder值),而不是你为这个问题改变了什么吗?例如,你可以验证@input的类型实际上是一个varchar,并且在创建@query时确实使用了这个变量,并且设置@query的行不会使用'...'+ 201507',而你只是认为变量看起来更好? –

+0

只是一个提示,而不是单引号,请为您的标识符尝试方括号([,])。 – cjb110

+0

没有线指示符。只是'bcp'命令没有执行 – gene

回答

1

您的数据类型不匹配正在进行。您查询结束时的+ @input是问题。

我在猜测列[YYYYMM]是一个数字?它应该是一个字符串/ varchar。

所以,你的线可能是

declare @input as varchar 
set @input = '201505' 
set @query = 'SELECT ''Transaction Unique ID'',''Transaction Date''...WHERE YYYYMM = ''' + @input + '''' 

如果[YYYYMM]是一个字符串,或者如果它不是,它是数字

declare @input as int 
set @input = 201505 
set @query = 'SELECT ''Transaction Unique ID'',''Transaction Date''...WHERE YYYYMM = ' + cast(@input as varchar) 
+0

我有它的第二种方式,完全一样,你展示,它仍然无法正常工作。我用查询输出更新了我的问题。我打印出最终的查询。可能是这可以给我一些线索,我做错了什么 – gene

0

这是由于事实上查询'SELECT''Transaction ...'是varchar并且输入表示为INT,尽管它是varchar。使用:

SET @query = 
'SELECT ''Transaction Unique ID'',''Transaction Date'', ''Person Unique ID'' UNION ALL SELECT NULL AS ''Transaction Unique ID'', CONVERT(VARCHAR(10),CONVERT(DATETIME,Date,1),101) AS '' Transaction Date'', NULL AS ''Person Unique ID'' FROM tblChromeRiverInitData WHERE YYYYMM = ''' + CONVERT(VARCHAR, @input) + '''' 
+0

我试过你的建议,但仍然有一个'NULL'作为输出。声明,如果执行,应该创建一个文件,但它不。 – gene

+0

@gene然后它做了什么? – cjb110

+0

我更新了我的问题与最终查询输出。这对我来说很好。 – gene

0

我固定的问题。问题是我没有设置用于构建文件名的变量。当执行bcp时,文件名称没有正确构建