2015-04-23 69 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)' 
相關問題