2015-04-23 108 views
-1

我在这里创建了一个搜索SP,只是根据屏幕上的用户输入准备参数。数据类型varchar(max)和日期在add操作符中不兼容

现在,问题是,我需要投表表格列以及输入参数与DATE类型,然后需要查询。

下面是我需要实现的程序的一部分。

问题是,现在越来越以下错误:The data types varchar(max) and date are incompatible in the add operator.

DECLARE @WhereClause VARCHAR(MAX) 
    DECLARE @DateField DATETIME = GETDATE() 
    DECLARE @DateFieldTo DATETIME = GETDATE() +1 

    SET @WhereClause = @WhereClause + ' AND CAST(tbl.DateField AS DATE) BETWEEN ''' + CAST(@DateField AS DATE) + ''' + AND ''' + CAST(@DateFieldTo AS DATE)+ ''   

    PRINT @WhereClause 

可以在任何请解决这个问题。

尝试以下方法:

Error: Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'. 

Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

DECLARE @WhereClause VARCHAR(MAX) 
    DECLARE @DateField DATETIME = GETDATE() 
    DECLARE @DateFieldTo DATETIME = GETDATE() +1 
    DECLARE @YourSQLVariable VARCHAR(MAX) 


    SET @WhereClause = @WhereClause + ' AND CAST(tbl.DateField AS DATE) BETWEEN CAST(@DateField AS DATE) + AND CAST(@DateFieldTo AS DATE)' 

    SET @YourSQLVariable = 'SELECT 1 WHERE' + @WhereClause 

    EXEC sp_executeSQL @YourSQLVariable,N'@DateField DATETIME,@DateFieldTo DATETIME ',@DateField,@DateFieldTo 

感谢

+0

您必须先投下的部分'CAST(@DateField AS DATE)''来varchar'。 – NickyvV

回答

0

不能连接使用字符串Date对象:

DECLARE @WhereClause VARCHAR(MAX) 
DECLARE @DateField DATETIME = GETDATE() 
DECLARE @DateFieldTo DATETIME = GETDATE() +1 

SET @WhereClause = @WhereClause + ' AND CONVERT(VARCHAR(10),tbl.DateField,120) BETWEEN ''' + CONVERT(VARCHAR(10),@DateField,120) + ''' + AND ''' + CONVERT(VARCHAR(10),@DateFieldTo,120)+ ''''   

PRINT @WhereClause 
2

它,因为你想在这行不支持

SET @WhereClause = @WhereClause + ' AND CAST(tbl.DateField AS DATE) BETWEEN ''' + CAST(@DateField AS DATE) + ''' + AND ''' + CAST(@DateFieldTo AS DATE)+ '' 

你可以做到这一点使用这样的事情

SET @WhereClause = @WhereClause + ' AND CAST(tbl.DateField AS DATE) BETWEEN CAST(@DateField AS DATE) + AND CAST(@DateFieldTo AS DATE)' 

来连接一个DATECAST(tbl.DateField AS DATE)一个字符串@WhereClause和运行sp_executeSQL时,使用此

@YourSQLVariable = @SelectClause + @WhereClause 
EXEC sp_executeSQL @YourSQLVariable,N'@DateField DATETIME,@DateFieldTo DATETIME ',@DateField,@DateFieldTo 
+0

我试过在上面编辑的问题中显示的示例脚本,但又给出了另一个错误。请指导。 – dsi

+0

这是因为错误状态'sp_executeSQL'需要'ntext/nchar/nvarchar'类型的参数。将你的变量'@ YourSQLVariable'改为'NVARCHAR(MAX)' – ughai

0

SQL不允许将字符串与其他数据类型连接。

DECLARE @WhereClause VARCHAR(MAX) = '' 
DECLARE @DateField DATETIME = GETDATE() 
DECLARE @DateFieldTo DATETIME = GETDATE() +1 

SET @WhereClause = @WhereClause + ' AND CAST(tbl.DateField AS DATE) BETWEEN ''' + CONVERT(VARCHAR(25), @DateField, 120) + ''' AND ''' + CONVERT(VARCHAR(25), @DateFieldTo, 120) + '''' 

PRINT @WhereClause 

此外,@WhereClause未定义,所以连接不起作用的初始空字符串。

+0

为什么你会建议108式样,它只返回时间部分? –

+0

非常好的一点,我在创建查询时正在考虑其他事情。谢谢。我更新了我的帖子以纠正风格。 – Steven

0

你可以试试这个日期铸造或日期比较只w.r.t日期,

DECLARE @SqlQuery VARCHAR(MAX) = '' 
DECLARE @UserId VARCHAR(MAX) = 'TestUser' 
DECLARE @StartDate DATETIME = GETDATE() 
DECLARE @EndDate DATETIME = DATEADD(WEEK, -6, GETDATE()) 
SET @SqlQuery = 'SELECT * FROM User Z WHERE Z.Id = ''' + @UserId + ''' AND CAST(Z.CreatedDate AS DATE) BETWEEN CAST(''' + CONVERT(NVARCHAR(24), @StartDate, 101) + ''' AS DATE) AND CAST(''' + CONVERT(NVARCHAR(24), @ENDDATE, 101) +''' AS DATE)' 
相关问题