你可以嘗試更新表來擺脫這些字符:
UPDATE dbo.[audit]
SET UserID = REPLACE(UserID, CHAR(0), '')
WHERE CHARINDEX(CHAR(0), UserID) > 0;
但你還需要解決什麼是把這個壞數據進入表在第一個地方。在此期間也許嘗試:
SELECT CONVERT(INT, REPLACE(UserID, CHAR(0), ''))
FROM dbo.[audit];
但是,這並不是一個長期的解決方案。修復數據(以及數據類型)。如果不能立即修復的數據類型,那麼你可以迅速地通過增加一個檢查約束找到罪魁禍首:
ALTER TABLE dbo.[audit]
ADD CONSTRAINT do_not_allow_stupid_data
CHECK (CHARINDEX(CHAR(0), UserID) = 0);
編輯
好了,這是絕對是一個4位數的整數,其後由CHAR的六個實例(0)。我貼絕對是替代方法適用於我:
DECLARE @foo TABLE(UserID VARCHAR(32));
INSERT @foo SELECT 0x31353831000000000000;
-- this succeeds:
SELECT CONVERT(INT, REPLACE(UserID, CHAR(0), '')) FROM @foo;
-- this fails:
SELECT CONVERT(INT, UserID) FROM @foo;
請確認自身的代碼(很好,第一SELECT
,反正)你的作品。如果確實如此,那麼您得到的錯誤來自不同行中的另一個非數字字符(如果不存在,那麼可能您的構建中某個特定的錯誤尚未修復)。嘗試縮小它,你可以通過下列字符組成的查詢採取隨機值,然後循環:
SELECT UserID, CONVERT(VARBINARY(32), UserID)
FROM dbo.[audit]
WHERE UserID LIKE '%[^0-9]%';
於是採取隨機排,然後將輸出粘貼到這樣的查詢:
DECLARE @x VARCHAR(32), @i INT;
SET @x = CONVERT(VARCHAR(32), 0x...); -- paste the value here
SET @i = 1;
WHILE @i <= LEN(@x)
BEGIN
PRINT RTRIM(@i) + ' = ' + RTRIM(ASCII(SUBSTRING(@x, @i, 1)))
SET @i = @i + 1;
END
你遇到一排一些其他原因,而不是CHAR(0)
失敗之前這可能需要一些試驗和錯誤 - 因爲你不能真正篩選出含有CHAR(0)
行,因爲它們可能含有CHAR(0)
和CHAR(something else)
。我們都知道你有一個像在表中的值:
SELECT '15' + CHAR(9) + '23' + CHAR(0);
...這也不能轉換爲整數,您是否已經更換CHAR(0)
與否。
我知道你不想聽到它,但我真的很高興這對人們來說是痛苦的,因爲現在當人們對數據類型做出非常差的決定時,他們有更多的戰爭故事可以推遲。
在表中的用戶ID列只有整數值或VARCHAR值。對於如:122像這樣或122Adf這樣......? – Pandian
UserID列只有Integer值。謝謝! – Milacay