ile bazı alt dizinler için bir DB'deki tüm metin alanlarını aramak için Yüzlerce tablo ve birkaç bin sütunla birlikte büyük bir şema sahibiyim. Belirli bir IP adresinin bu veritabanında çeşitli yerlerde saklandığını biliyordum, ancak hangi tabloların veya sütunların depolandığından emin değilim. Temel olarak, her yerde bunu bulmaya çalışıyorum. IP adresi DB'de saklanır, böylece tüm bu yerlerde yeni bir değere güncelleyebilirim.T-SQL
İşte bir T-SQL deyimindeki ilk çatlağım tabloyu ve sütun adını yazdıracak ve bu değer, veritabanındaki 10.15.13 alt dizinine sahip her bir metin sütunundaki değeri.
Şimdi, bu tür işler. Sorun şu ki, Management Studio'da çalıştırdığımda, sp_executesql çağrısı hiçbir şey döndürmeyen her sorgudaki tüm boş sonuçları gerçekten döndürecektir (yani sütunun bu alt dize ile herhangi bir kaydı yoktur) ve sonuç penceresini doldurur. Max'e, sonra da herhangi bir şeyin basılmış olup olmadığını göremiyorum.
Bu sorguyu yazmanın daha iyi bir yolu var mı? Ya da bunu farklı bir şekilde çalıştırabilirim, böylece yalnızca bu alt dizinin bulunduğu Tabloları ve Sütunları göstersin?
DECLARE
@SchemaName VARCHAR(50),
@TableName VARCHAR(50),
@ColumnName VARCHAR(50);
BEGIN
DECLARE textColumns CURSOR FOR
SELECT s.Name, tab.Name, c.Name
FROM Sys.Columns c, Sys.Types t, Sys.Tables tab, Sys.Schemas s
WHERE s.schema_id = tab.schema_id AND tab.object_id = c.object_id AND c.user_type_id = t.user_type_id
AND t.Name in ('TEXT','NTEXT','VARCHAR','CHAR','NVARCHAR','NCHAR');
OPEN textColumns
FETCH NEXT FROM textColumns
INTO @SchemaName, @TableName, @ColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql NVARCHAR(MAX),
@ParamDef NVARCHAR(MAX),
@result NVARCHAR(MAX);
SET @sql = N'SELECT ' + @ColumnName + ' FROM ' + @SchemaName + '.' + @TableName + ' WHERE ' + @ColumnName + ' LIKE ''%10.15.13%''';
SET @ParamDef = N'@resultOut NVARCHAR(MAX) OUTPUT';
EXEC sp_executesql @sql, @ParamDef, @resultOut = @result OUTPUT;
PRINT 'Column = ' + @TableName + '.' + @ColumnName + ', Value = ' + @result;
FETCH NEXT FROM textColumns
INTO @SchemaName, @TableName, @ColumnName
END
CLOSE textColumns;
DEALLOCATE textColumns;
END
Ben alt dize bulundu ki tablo/sütun ve bu sütundaki tam değerini gösterir yerde de böyle sonuçlar şey görmek istiyorum
...
Column = SomeTable.SomeTextColumn, Value = 'https://10.15.13.210/foo'
Column = SomeTable.SomeOtherColumn, Value = '10.15.13.210'
vs.
Kapanışınız. Bu örnekle sizinkiyle karşılaştırın: [SQL Server tablosundaki tüm sütunlarda dize değeri arama ve bulma] (http://www.mssqltips.com/sqlservertip/1522/searching-and-finding-a-string-value-in -all-sütunlar-in-a-sql-sunucu-tablo /) – Jeremy
Başar Teşekkürler! Aslında bu çözümü bağlantıdan kullanmamıştım çünkü bir kerede tek bir tabloyu aramak içindir, ancak bir veritabanındaki tüm tabloları aramak için tam bir çözümün başka bir bağlantısı vardı; tam olarak ihtiyacım olan şey. http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm Lütfen bunu bir cevap olarak gönderin ve doğru olarak işaretleyeceğim! – Jim
Cevabın yanı sıra, kuşak için atıfta bulunduğunuz bağlantıyı da ekledim. Teşekkürler! – Jeremy