5

「nvarchar 値 '23,24,3,45,91' をデータ型 int に変換中に変換に失敗しました」というエラーが表示されます。エラーは ON 句で発生しているようです。E.ID は整数フィールドで、F.LegalIssue はコンマで区切られた整数の varchar フィールドです。以下はそのエラーのあるコードです。

SELECT F.[FDTitle], E.PrimaryOpID as [FD Primary OP ID], F.County as [FD County], F.Status as [FD Status], F.IssueDate as [FD Date]
FROM [dbo].[tbl_FinalDetMain] F
LEFT OUTER JOIN [dbo].[tbl_lk_Exemptions_FD] E ON E.ID = F.LegalIssue
WHERE F.[FDNbr] = '2013-0041'

on 句に対して以下のコードを試しましたが、整数の文字列全体ではなく、1 つの整数値のみが返されます。

E.ID = cast(LEFT(F.LegalIssue,PATINDEX('%[^0-9]%',F.LegalIssue)-1) as int)

結果には、コンマで区切られた 5 つの整数が含まれている必要があります。

4

3 に答える 3

3

xml データ型を使用すると、このように文字列を整数に分解できます。私が言うユーザー定義関数の良い候補:-)

declare @test varchar(max)

set @test = '1,2,3,4,5'

select 
     T2.item.value('(./text())[1]','int') 
from
     (select convert(xml,'<items><t>'+replace(@test,',','</t><t>')+'</t></items>') as xmldoc)
as xmltable
     CROSS APPLY xmltable.xmldoc.nodes('/items/t') as T2(item) 
于 2013-09-11T15:34:18.383 に答える
1

F.LegalIssue を多くの行に正規化するか、LIKE を使用する必要があります。

何かのようなもの

    CAST(E.ID A VARCHAR(50)) = F.LegalIssue
OR  F.LegalIssue LIKE CAST(E.ID A VARCHAR(50)) + ',%'
OR  '%,' + F.LegalIssue LIKE CAST(E.ID A VARCHAR(50)) + ',%'
OR  '%,' + F.LegalIssue LIKE CAST(E.ID A VARCHAR(50))

ご覧のとおり、テーブルの実際の設計が問題です。現在持っているデザインは避けて、1 to manyまたはmany to manyデザインを選択する必要があります。

これは、再帰的な CTE を使用して値を平坦化する方法のデモです。

SQL フィドルのデモ

テスト テーブルとデータの作成

CREATE TABLE Tada(
  ID INT,
  SomeCommaString VARCHAR(50)
  )
INSERT INTO Tada Values (1, '10'),(2,'5,6,12,16')

テーブルの平坦化

;WITH Vals AS (
  SELECT 
      ID,
      CASE
          WHEN CHARINDEX(',',SomeCommaString) = 0
            THEN SomeCommaString
          WHEN CHARINDEX(',',SomeCommaString) > 0
            THEN LEFT(SomeCommaString,CHARINDEX(',',SomeCommaString) - 1)
      END Val,

      CASE
          WHEN CHARINDEX(',',SomeCommaString) > 0
            THEN RIGHT(SomeCommaString,LEN(SomeCommaString) - CHARINDEX(',',SomeCommaString))
          ELSE NULL
      END Remainder
  FROM Tada
  UNION ALL
  SELECT 
      ID,
      CASE
          WHEN CHARINDEX(',',Remainder) = 0
            THEN Remainder
          WHEN CHARINDEX(',',Remainder) > 0
            THEN LEFT(Remainder,CHARINDEX(',',Remainder) - 1)
      END Val,

      CASE
          WHEN CHARINDEX(',',Remainder) > 0
            THEN RIGHT(Remainder,LEN(Remainder) - CHARINDEX(',',Remainder))
          ELSE NULL
      END Remainder

  FROM Vals
  WHERE Remainder IS NOT NULL
)
SELECT ID, Val
FROM Vals
于 2013-09-11T14:50:30.260 に答える