web-dev-qa-db-ja.com

クエリのテキストフィールドで結合

テーブルのDDLを変更できませんが、2つのtextフィールドで結合する必要があります。エラーが出ます

メッセージ402、レベル16、状態1、行23
データタイプのテキストとテキストは、等号演算子で互換性がありません。

以下は私の問題を説明するサンプルDDLですが、どうすれば克服できますか?

Declare @Table1 Table(id text,name nvarchar(200))
Insert Into @Table1 (id, name) Values
('123', 'Joe'), ('222.00', 'Jim')
Declare @Table2 Table (id text,green nvarchar(200))
Insert Into @Table2 (id, green) Values
('123', 'JDSKLJS'), ('222.00', 'KLJKLJJKL')
Select
*
FROM @Table1 t1
INNER JOIN @Table2 t2
ON t1.id = t2.id

textフィールドをvarchar(max)としてキャストできます

Declare @Table1 Table(id text,name nvarchar(200))
Insert Into @Table1 (id, name) Values
('123', 'Joe'), ('222.00', 'Jim')
Declare @Table2 Table (id text,green nvarchar(200))
Insert Into @Table2 (id, green) Values
('123', 'JDSKLJS'), ('222.00', 'KLJKLJJKL');

Select
*
FROM @Table1 t1
INNER JOIN @Table2 t2
ON cast(t1.id as varchar(max)) = cast(t2.id as varchar(max))
GO
 id |名前| id |緑
:-- :--- | :----- | :-------- 
 123 |ジョー| 123 | JDSKLJS 
 222.00 |ジム| 222.00 | KLJKLJJKL 

dbfiddle ---(ここ

3
McNets

(結合で)より小さなデータ型に変換する必要があります:

Select *
FROM @Table1 t1
INNER JOIN @Table2 t2
ON CONVERT(varchar(8000),t1.id) = CONVERT(varchar(8000),t2.id)

または、あなたが知っているいくつかの小さな数字がマッチをユニークにするでしょう。

0
BradC
SELECT *
FROM @Table1 t1
INNER JOIN @Table2 t2
ON CAST(t1.id AS varchar(max)) = CAST(t2.id AS varchar(max))

パフォーマンスはかなりひどいことに注意してください。したがって、どのような種類の製品コードでもこれを行うことはありません。スキーマをリファクタリングして、実行しようとしていることをより適切にサポートします。

0
db2