Bạn có thể thử cập nhật bảng để thoát khỏi những ký tự:
UPDATE dbo.[audit]
SET UserID = REPLACE(UserID, CHAR(0), '')
WHERE CHARINDEX(CHAR(0), UserID) > 0;
Nhưng sau đó bạn cũng sẽ cần phải sửa chữa bất cứ điều gì là đưa dữ liệu xấu này vào bảng ở nơi đầu tiên. Trong thời gian chờ đợi, có thể thử:
SELECT CONVERT(INT, REPLACE(UserID, CHAR(0), ''))
FROM dbo.[audit];
Nhưng đó không phải là giải pháp lâu dài. Sửa dữ liệu (và kiểu dữ liệu trong khi bạn đang ở đó). Nếu bạn không thể sửa chữa các kiểu dữ liệu ngay lập tức, sau đó bạn có thể nhanh chóng tìm ra thủ phạm bằng cách thêm một hạn chế kiểm tra:
ALTER TABLE dbo.[audit]
ADD CONSTRAINT do_not_allow_stupid_data
CHECK (CHARINDEX(CHAR(0), UserID) = 0);
EDIT
Ok, do đó chắc chắn là một số nguyên 4 chữ số sau bởi sáu trường hợp CHAR (0). Và workaround tôi đăng chắc chắn làm việc cho tôi:
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;
Vui lòng xác nhận rằng mã này ngày của riêng mình (tốt, là người đầu tiên SELECT
, dù sao) làm việc cho bạn. Nếu nó xảy ra thì lỗi bạn đang nhận được từ một ký tự không phải là số khác trong một hàng khác (và nếu không thì có lẽ bạn có một bản dựng nơi một lỗi cụ thể chưa được sửa).Để thử và thu hẹp nó xuống, bạn có thể lấy các giá trị ngẫu nhiên từ các truy vấn sau đây và sau đó lặp qua các nhân vật:
SELECT UserID, CONVERT(VARBINARY(32), UserID)
FROM dbo.[audit]
WHERE UserID LIKE '%[^0-9]%';
Vì vậy, phải mất một hàng ngẫu nhiên, và sau đó dán các đầu ra vào một truy vấn như thế này:
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
này có thể mất một số thử và sai trước khi bạn gặp một hàng thất bại đối với một số lý do nào khác hơn CHAR(0)
- vì bạn có thể không thực sự lọc ra các hàng có chứa CHAR(0)
vì họ có thể chứa CHAR(0)
vàCHAR(something else)
. Đối với tất cả chúng ta đều biết bạn có giá trị trong bảng như:
SELECT '15' + CHAR(9) + '23' + CHAR(0);
... mà cũng không thể được chuyển đổi sang một số nguyên, cho dù bạn đã thay thế CHAR(0)
hay không.
Tôi biết bạn không muốn nghe, nhưng tôi thực sự vui vì điều này gây đau đớn cho mọi người, bởi vì bây giờ họ có nhiều câu chuyện chiến tranh hơn để đẩy lùi khi mọi người đưa ra quyết định rất kém về loại dữ liệu.
Trong bảng UserID cột chỉ có giá trị nguyên hoặc giá trị Varchar bất kỳ .. Ví dụ: 122 như thế này HOẶC 122Adf như thế này ...? – Pandian
cột UserID chỉ có giá trị Integer. Cảm ơn! – Milacay