[英]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.