代码之家  ›  专栏  ›  技术社区  ›  gene

SQL中bcp命令的查询语法有问题

  •  2
  • gene  · 技术社区  · 9 年前

    我正在为SQL中的bcp命令构建查询。 执行语句时,我出现以下错误:

    转换varchar值“SELECT”时转换失败 '交易唯一ID','交易日期','个人唯一ID' UNION ALL SELECT NULL AS“事务唯一ID”, 转换(VARCHAR(10),转换(DATETIME,Date,1),101)AS'事务 日期',NULL为'Person Unique ID'FROM tblChromeRiverInitData WHERE YYYYMM='到数据类型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'
    

    我已经试着解决这个问题好一阵子了,这真的让我很烦。

    你能解释一下我做错了什么吗?如果可能的话,请告诉我正确的做法?

    3 回复  |  直到 9 年前
        1
  •  1
  •   cjb110    9 年前

    数据类型不匹配 + @input 问题就在你的询问结束时。

    我猜是专栏 [YYYYMM] 是数字吗?它应该是字符串/varchar。

    所以你的台词可能是

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

    如果 [年] 是一个字符串,或者如果不是并且是数字

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

    这是因为查询“SELECT”“Transaction…”是varchar,而输入虽然是varchar但表示为INT。使用:

        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) + ''''
    
        3
  •  0
  •   gene    9 年前

    我解决了这个问题。问题是我没有设置用于构建文件名的变量。执行bcp时,文件名未正确生成