データベースあなたの場合は不可能ですが、別のアプローチが必要です。
1つのオプションは、string splitting functionにCROSS APPLY
を使用して、列の内容を取り出して行に分割して、列の内容を照会できるようにすることです。クエリが非常に簡単になり
DECLARE @TableA as table
(
id int identity(1,1),
ColumnA varchar(100)
)
INSERT INTO @TableA VALUES
('#1002#15#'),
('#1002#16#'),
('#1003#17#'),
('#1003#17#16#'),
('#1004#18#'),
('#1004#18#3#'),
('#1004#18#3#1155#'),
('#1002#15#1002#'),
('#1004#18#3#1004#'),
('#1003#17#17#')
:
今
CREATE FUNCTION dbo.SplitStrings_XML
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
);
GO
は、サンプルテーブルを作成し、移入:私はアーロンの記事からSplitStrings_XML
選択したこのデモのために
SELECT id, ColumnA
FROM @TableA
CROSS APPLY dbo.SplitStrings_XML(ColumnA, '#')
WHERE Item IS NOT NULL
GROUP BY id, ColumnA
HAVING COUNT(Item) > COUNT(DISTINCT Item)
結果:
id ColumnA
----------- -----------------
8 #1002#15#1002#
9 #1004#18#3#1004#
10 #1003#17#17#
Sqlサーバーは、CRL機能以外の正規表現をサポートしていません。データベースを正常化し、その列Aを表に変更するのではなく、[区切りのデータを単一の列に保持する]。(http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a実際にはデータベースの列) –
ugh。ありがとうございました。問題は、私はテーブルの構造を所有していないので、私はそこにあるものをクエリする必要があります...構造を変更することはできません。 hm。したがって、本質的にSQLサーバーでそれを行う良い方法はないと言っています。おそらく私は別のテーブルにそれをダンプすることができます。それは、そこにdup数値を見つける一回の運動だからです。 – SGM
あなたは、iTVFスプリッタ機能を使うことができます。詳細を参照してくださいhttp://www.sqlservercentral.com/articles/Tally+Table/72993/ CREATE権限がない場合は、cte – Serg