2017-08-06 212 views
0

我的表中的数据是这样的:SQL Server查询

enter image description here

我使用这个查询:

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) 

SELECT @cols = STUFF((SELECT distinct ','+ QUOTENAME('COMPLETE_' + cast(row_number() over(partition by CID order by CID) as varchar(10))) 
         FROM allleads 
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

SET @query = 'SELECT CustomerName, address, CID, ' + @cols + 
       ' FROM (SELECT CustomerName, address, CID, COMPLETE,''COMPLETE_''+ CAST(row_number() over (partition by CID order by RecordDate) as varchar(10)) val from allleads) x PIVOT (MAX(COMPLETE) for val in (' + @cols + ')) p ' execute(@query) 

工作正常。

但当我日之间添加一个搜索条件是这样的:

DECLARE @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX), 
     @dt AS VARCHAR(10), 
     @dt1 AS VARCHAR(10) set 
     @dt='2017/05/18' set 
     @dt1='2017/07/10' 
select @cols = STUFF((SELECT distinct ','+ 
        QUOTENAME('COMPLETE_' + 
        cast(row_number() 
       over(partition by CID order by CID) as varchar(10))) 
       from allleads FOR XML PATH(''), 
       TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

    set @query = 'SELECT CustomerName,address,CID, ' + 
     @cols + ' from (select CustomerName,address,CID, COMPLETE,''COMPLETE_''+ 
     cast(row_number() 
     over(partition by CID order by RecordDate) as varchar(10)) 
    val from allleads **where convert(varchar(10),RecordDate,111) between '[email protected]+' and '[email protected]+'**) x pivot(max(COMPLETE) for val in (' + @cols + ')) p ' execute(@query) 

则显示错误:

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value '2017/05/19' to data type int.

请帮助。

在此先感谢。

+1

'@ query'的** exact **值是什么? – mjwills

回答

0

你应该真的在查询中使用常量参数。 。 。并使用sp_executesql来传递它们。

对于您的情况,问题在日期周围缺少引号。相反的:

between '[email protected]+' and '[email protected]+' 

你可以这样做:

between '''[email protected]+''' and '''[email protected]+''' 

换句话说,当你执行代码,而不是当你定义字符串错误发生。

您还应该学会以不太马虎的方式编写代码。我看不出你甚至可以阅读它,更不用说其他人了。