テーブルを更新して、これらの文字を取り除くことができます。
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) の 6 つのインスタンスが続きます。そして、私が投稿した回避策は間違いなく機能します:
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)
ん。
あなたがそれを聞きたくないのはわかっていますが、これが人々にとって苦痛であることを本当にうれしく思います。なぜなら、人々がデータ型について非常に悪い決定を下したときに、反論する戦争の話が増えているからです.