Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 запрос поиска binary  [new]
warcraft3
Member

Откуда:
Сообщений: 14
Есть скрипт который ищет во всех таблицах заданное значение и выводит список:
/*
искомое занести в переменную @what 

*/


SELECT c.TABLE_NAME, c.TABLE_SCHEMA, c.COLUMN_NAME 
INTO #srch
FROM INFORMATION_SCHEMA.[COLUMNS] c 
WHERE DATA_TYPE IN ('varchar','char','nvarchar')
ORDER BY TABLE_NAME
go

DECLARE @cmd VARCHAR(2048)
DECLARE @tbl VARCHAR(100)
DECLARE @tbl_old VARCHAR(100)
DECLARE @clm VARCHAR(100)
DECLARE @own VARCHAR(50)
DECLARE @what VARCHAR(100)
DECLARE @bar INT
DECLARE @i int
SET @cmd=''
SET @what='?????????????'
SET @i=1
SET @tbl_old=''

SELECT @bar=COUNT(1) FROM #srch

WHILE EXISTS (SELECT TOP 1 1 from #srch) 
  BEGIN
  	SELECT TOP 1 @own=TABLE_SCHEMA, @tbl=TABLE_NAME, @clm=COLUMN_NAME
  	FROM #srch
  	
  	IF @tbl_old!=@tbl 
  	  BEGIN
  	  	SELECT @cmd='Analyzing table :  '+QUOTENAME(@own)+'.'+QUOTENAME(@tbl)
  	  	PRINT @cmd
  	  END
  	
  	SELECT @cmd='set nocount on; if exists (select 1 from '+QUOTENAME(@own)+'.'+QUOTENAME(@tbl)+' where lower('+QUOTENAME(@clm)+') like ''%'+@what+'%'') '+
  	'select '''+QUOTENAME(@own)+'.'+QUOTENAME(@tbl)+'.'+QUOTENAME(@clm)+''' as [Object], '+
  	     '''select '++QUOTENAME(@clm)+', * from '+QUOTENAME(@own)+'.'+QUOTENAME(@tbl) +
  	        ' where lower('+QUOTENAME(@clm)+') like ''''%'+@what+'%'''''' as [cmd]'
  	
  	--PRINT @cmd
  	EXEC (@cmd)
  	
  	SELECT @i=@i+1
  	IF ((@i*100/@bar)%5)=0
  	   BEGIN
  	   	 SELECT @cmd='************************** Search progress: '+CONVERT(VARCHAR(10),@i*100/@bar)+'% ('+ CONVERT(VARCHAR(10),@i)+' / '+CONVERT(VARCHAR(10),@bar)+')'
  	     PRINT @cmd
  	   END  
  	
  	DELETE #srch
  	WHERE TABLE_SCHEMA=@own
  	AND TABLE_NAME=@tbl
  	AND COLUMN_NAME=@clm
  	
  	SELECT @tbl_old=@tbl
  END 

Он отлично работает с varchar.
Но необходимо его переделать для поиска binary.
У меня не получилось =( кому не трудно помогите.
7 сен 11, 11:56    [11239555]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
aleks2
Guest
Syntax
 
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ] 
 
Arguments
match_expression 
Any valid expression in SQL Server Compact Edition of nchar, nvarchar, or ntext data type.

А ничо, что LIKE binary не поддерживает?
7 сен 11, 12:11    [11239724]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
warcraft3
Member

Откуда:
Сообщений: 14
Блин, вот туплю я... А какие-нибудь варианты поиска есть?
7 сен 11, 12:19    [11239789]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
warcraft3
Блин, вот туплю я... А какие-нибудь варианты поиска есть?

Например, конвентировать (для binary и varbinary) в строку и тогда LIKE.
С уважением, Алексей
7 сен 11, 12:23    [11239824]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
warcraft3
Member

Откуда:
Сообщений: 14
Aleksey-K
warcraft3
Блин, вот туплю я... А какие-нибудь варианты поиска есть?

Например, конвентировать (для binary и varbinary) в строку и тогда LIKE.
С уважением, Алексей


Поясните. Вот в базе куча таблиц, в которых есть значения в binary.
Беру одно такое значение, конвертирую его в строку, вставляю полученное в данный скрипт где используется LIKE для поиска. И оно найдет себя во всех таблицах где используется?
7 сен 11, 12:38    [11239941]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
warcraft3,

В целом - да, так и будет. Но только не "найдет себя" а "найдет подобие себя", у вас же там %% в лайке.
Кроме того - далекооо не факт что подобное сопоставление будет корректно с алгоритмической т.з. именно вашего приложения. Зависит от того какой смысл заложен во все эти байнари. В общем - вариант рабочий, но требует тщательного теста!
7 сен 11, 13:07    [11240186]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Aleksey-K
warcraft3
Блин, вот туплю я... А какие-нибудь варианты поиска есть?

Например, конвентировать (для binary и varbinary) в строку и тогда LIKE.
С уважением, Алексей
LIKE не сработает.
Можно использовать CHARINDEX.
7 сен 11, 13:15    [11240261]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
warcraft3
Member

Откуда:
Сообщений: 14
alexeyvg
Aleksey-K
пропущено...

Например, конвентировать (для binary и varbinary) в строку и тогда LIKE.
С уважением, Алексей
LIKE не сработает.
Можно использовать CHARINDEX.


Можешь поправить тогда скрипт выше, чтоб использовать charindex?
7 сен 11, 15:17    [11241441]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
alexeyvg
LIKE не сработает.


Проверим?
USE tempdb
GO
CREATE TABLE #tt(id int IDENTITY, x varbinary(200))
GO
INSERT #tt
VALUES (CAST('1755' as VARBINARY(200))),(CAST('5175' as VARBINARY(200))),
(CAST('3409' as VARBINARY(200))),(CAST('9090' as VARBINARY(200))),(CAST('9928417' as VARBINARY(200)))
GO
SELECT * FROM #tt
SELECT x AS VarBinaryValue, CAST(x AS CHAR(7)) AS VarcharValue FROM #tt WHERE CAST(x AS VARCHAR(7)) LIKE '%17%'
go
DROP TABLE #tt

По традиции:
@@VERSION
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
7 сен 11, 18:41    [11243531]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
SamMan
alexeyvg
LIKE не сработает.


Проверим?


select 1
where convert(varchar, 0x0102000003040506070809) like '%' + convert(varchar, 0x02000304) + '%'
LIKE игнорирует нули, кроме того, он неправильно обработает спецсимволы %[_]
7 сен 11, 19:39    [11243799]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
alexeyvg
LIKE игнорирует нули


Да нет, понятно что если изначально инфа НЕ текстовая - никакие ухищрения/касты/конверты текст нам не вернут, а будут гнать сплошные "ромбики". А LIKE - он изначально под текст заточен и только под него. Поэтому я и сказал, вариант с varbinary->varchar рабочий, но сильно контекстнозависимый. Смотря что в этих varbinary на самом деле лежит. PlainText (переведенный в байты) - это одно, а JPG - совсем другое. Решение совершенно точно и далеко не универсальное, с этим и не спорю.
7 сен 11, 21:29    [11244107]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
SamMan
alexeyvg
LIKE игнорирует нули


Да нет, понятно что если изначально инфа НЕ текстовая - никакие ухищрения/касты/конверты текст нам не вернут, а будут гнать сплошные "ромбики". А LIKE - он изначально под текст заточен и только под него. Поэтому я и сказал, вариант с varbinary->varchar рабочий, но сильно контекстнозависимый. Смотря что в этих varbinary на самом деле лежит. PlainText (переведенный в байты) - это одно, а JPG - совсем другое. Решение совершенно точно и далеко не универсальное, с этим и не спорю.
Да. разумеется, я исходил из того, что ищётся именно не текст.

Для текста, понятно, достаточно конверт поставить...
7 сен 11, 21:41    [11244147]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
warcraft3
Member

Откуда:
Сообщений: 14
Хорошо что решили спор, но все-таки поможете с проблемой?)

Нужно найти допустим все таблицы где присутствует 0х887DF4CE46B9950011E0C327E93010D8
Это кстати констрейнты в sql базе 1С.
Через них идет связь между таблицами. Но никаких внешних ключей.
8 сен 11, 14:47    [11247851]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
aleks2
Guest
Тибе ж сказали три раза: CHARINDEX(), CHARINDEX(), CHARINDEX().

В твоем варианте использования LIKE, CHARINDEX полностью заменит LIKE и для (var)char.
8 сен 11, 15:22    [11248331]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
aleks2
Guest
SET @cmd=
'set nocount on;'
+
' if exists (select * from ''@own''.''@tbl'' where CHARINDEX(''@what'', lower(''@clm''))>0'
+
' select ''''@own''.''@tbl''.''@clm'''' as [Object], ''select ''@clm'', * from ''@own''.''@tbl'' where CHARINDEX(''@what'', lower(''@clm''))>0'' as [cmd]'
 
set @cmd=REPALCE(@cmd, '@own', @own)
set @cmd=REPALCE(@cmd, '@tbl', @tbl)
set @cmd=REPALCE(@cmd, '@clm', @clm)
set @cmd=REPALCE(@cmd, '@what', @what)
8 сен 11, 15:42    [11248565]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
warcraft3
Хорошо что решили спор, но все-таки поможете с проблемой?)

Нужно найти допустим все таблицы где присутствует 0х887DF4CE46B9950011E0C327E93010D8
Это кстати констрейнты в sql базе 1С.
Через них идет связь между таблицами. Но никаких внешних ключей.
Ну вы хоть попробуйте, что там сложного.

Не делать же за вас вашу работу, так вам совсем скучно будет :-)
8 сен 11, 15:47    [11248618]     Ответить | Цитировать Сообщить модератору
 Re: запрос поиска binary  [new]
iljy
Member

Откуда:
Сообщений: 8711
warcraft3
Хорошо что решили спор, но все-таки поможете с проблемой?)

Нужно найти допустим все таблицы где присутствует 0х887DF4CE46B9950011E0C327E93010D8
Это кстати констрейнты в sql базе 1С.
Через них идет связь между таблицами. Но никаких внешних ключей.

Хрустальный шар подсказал мне, что это банальный GUID . И не надо искать никаких вхождений, проверяйте на равенство.
8 сен 11, 16:04    [11248823]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить