簡體   English   中英

使用帶CONVERT或CAST的WHERE子句的T-SQL查詢

[英]T-SQL Query using WHERE clause with CONVERT or CAST

我在代碼中生成的特定T-SQL查詢時遇到問題。

下面是代碼,第一個DECLARE塊是從代碼發送的,所以這些值會改變。

XML業務與將CSV NVARCHAR轉換為臨時表有關。

-- DECLARE BLOCK IS SENT BY CODE FROM DIALOG BOX
DECLARE @IdString NVARCHAR(MAX) ='F6LC1'
DECLARE @pm_StartDate DATETIME ='20180201'
-- END DECLARE BLOCK

DECLARE @listOfIds table(entityId nvarchar(50));

DECLARE @x XML 

SELECT @x = CAST('<A>'+ REPLACE(REPLACE(@IdString,' ',''),',','</A><A>')+ '</A>' AS XML)

INSERT INTO @listOfIds
SELECT t.value('.', 'NVARCHAR(50)') AS inVal
FROM @x.nodes('/A') AS x(t)

DECLARE @pm_StartDateTrim NVARCHAR(MAX) = LEFT(CONVERT(NVARCHAR(MAX),@pm_StartDate,112),6)
DECLARE @intStartDate INT = CAST(@pm_StartDateTrim AS INT)

SELECT @pm_StartDate
SELECT @pm_StartDateTrim
SELECT @intStartDate

SELECT   gl.[ACCTNUM]
        ,acc.[ACCTNAME]
        ,gl.[ENTITYID]
        ,CONVERT(INT,gl.[PERIOD]) AS periodConverted
        ,gl.[ACTIVITY]
        ,bldg.[BLDGNAME]
        ,bldg.[BLDGGLA]
        ,gl.[BALFOR]
FROM [dbo].[GLSUM] AS gl
        INNER JOIN [dbo].[BLDG] AS bldg ON gl.[ENTITYID] = bldg.[BLDGID]
        INNER JOIN [dbo].[GACC] AS acc ON gl.[ACCTNUM] = acc.[ACCTNUM]
WHERE gl.ENTITYID IN (SELECT entityId FROM @listOfIds)
        AND gl.BASIS = 'A'
        AND gl.ACTIVITY != 0
        AND gl.PERIOD NOT LIKE '%[^0-9]%'
        AND CONVERT(INT,gl.[PERIOD]) >= @intStartDate
ORDER BY gl.PERIOD ASC

我正在嘗試僅包含那些PERIOD大於或等於提供的StartDate

數據庫中PERIOD的數據僅為YYYYMM ,因此與201502類似。

StartDate提供的數據是DATETIME ,所以我轉換為YYYYMM進行比較。

我正在嘗試將它們都設為INT因此我可以使用<>=等進行比較。

因此,如果我留在第2行到最后一行AND CONVERT(INT,gl.[PERIOD]) >= @intStartDate那么Conversion failed when converting the varchar value 'R2W274' to data type int.我會得到Conversion failed when converting the varchar value 'R2W274' to data type int.

問題是我的數據中沒有這樣的值。

當我注釋掉那一行時,我得到的數據和R2W274在任何記錄的任何字段中都找不到。

我相信R2W274值實際上在gl.ENTITYID字段中,但在我的任何記錄中都沒有,通常只在DB中。

所以,我不確定為什么這個查詢甚至試圖首先轉換gl.ENTITYID

有幫助嗎?

更新:

我在上面的WHERE子句中添加了推薦的附加內容。 我仍然得到同樣的錯誤。

請確保沒有返回的數據:

select * from [dbo].[GLSUM] where [Period] = 'R2W274'

像這樣添加try / catch塊會有所幫助:

BEGIN TRY  
    -- Generate divide-by-zero error.  
    your select query comes here.  
END TRY  
BEGIN CATCH  
    -- Execute error retrieval routine.  
    print 'error';
END CATCH;

Try / catch塊引用: https//docs.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql

我要做的是消除where子句中的這些數據:

WHERE gl.ENTITYID IN (SELECT entityId FROM @listOfIds)
        AND gl.BASIS = 'A'
        AND gl.ACTIVITY != 0
        AND gl.[PERIOD] not like '%[^0-9]%'
        AND CONVERT(INT,gl.[PERIOD]) >= @intStartDate

編輯:我期待where子句修改它的更改,驚訝為什么它不起作用。 請確保在包含轉換的過濾器之前添加了過濾器。 也許使用像這樣的臨時表會更安全:

select * 
into #temp_glsum
from [dbo].[GLSUM] gl
WHERE gl.[PERIOD] not like '%[^0-9]%'

並在主查詢中使用#temp_glsum而不是[dbo].[GLSUM]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM