<사용방법은..>
/*
To apply so:
exec spSearchOnAlldb 'Sugar%'
exec spSearchOnAlldb '%soft%'
exec spSearchOnAlldb '_5234_57%', 1
exec spSearchOnAlldb M_cro_oft
*/
위처럼 사용합니다. % 와 _로 여러글자 매칭과 한글자 매칭가능.
/*************************************************************************/
/* Procedure of search of a phrase on all database */
/* Is developed by Oufimtsev Gleb, MCSE */
/* */
/* gvu@newmail.ru, http://www.gvu.newmail.ru */
/* +7 (095) 178-40-92, Moscow, Russia */
/*************************************************************************/
CREATE PROCEDURE spSearchOnAlldb @phrase varchar(8000), @OutFullRecords bit=0 AS
/*
To apply so:
exec spSearchOnAlldb 'Sugar%'
exec spSearchOnAlldb '%soft%'
exec spSearchOnAlldb '_5234_57%', 1
exec spSearchOnAlldb M_cro_oft
*/
declare @sql varchar(8000)
declare @tbl varchar(128)
declare @col varchar(128)
declare @id_present bit
declare @is_char_phrase bit
declare @min_len int
declare @loop_idx int
declare @loop_chr char(1)
set nocount on
if IsNull(@phrase,'')=''
begin
raiserror('Phrase is absent',16,-1)
return
end
select @loop_idx=1, @is_char_phrase=0, @min_len=0
while @loop_idx<=LEN(@phrase)
begin
set @loop_chr=SUBSTRING(@phrase,@loop_idx,1)
if @loop_chr not in ('%','_') set @min_len=@min_len+1
if @is_char_phrase=0 and @loop_chr not in ('%','_','0','1','2','3','4','5','6','7','8','9','.')
set @is_char_phrase=1
set @loop_idx=@loop_idx+1
end
create table #tbl_res
(TableName varchar(128) not NULL,
ColumnName varchar(128) not NULL,
Id int NULL,
ColumnValue varchar(7500) not NULL)
declare CRR cursor local fast_forward for
select t.name, c.name, 1
from sysobjects t, syscolumns c
where t.type='U'
and c.id=t.id
and c.status&0x80=0 -- Not IDENTITY
and exists (select * from syscolumns c2 where t.id=c2.id and c2.status&0x80=0x80 and c2.xtype in (48,52,56))
and ( (@is_char_phrase=1 and c.xtype in (175,239,99,231,35,167) and c.length>=@min_len) -- char only
or (@is_char_phrase=0 and c.xtype not in (34,165,173,189,61,58,36))) -- char and numeric
union select t.name, c.name, 0
from sysobjects t, syscolumns c
where t.type='U'
and c.id=t.id
and not exists (select * from syscolumns c2 where t.id=c2.id and c2.status&0x80=0x80 and c2.xtype in (48,52,56))
and ( (@is_char_phrase=1 and c.xtype in (175,239,99,231,35,167) and c.length>=@min_len) -- char only
or (@is_char_phrase=0 and c.xtype not in (34,165,173,189,61,58,36))) -- char and numeric
order by 1,2
open CRR
fetch CRR into @tbl, @col, @id_present
while @@FETCH_STATUS=0
begin
if @OutFullRecords=0
begin
set @sql='insert into #tbl_res (TableName,ColumnName,Id,ColumnValue) '
+'select '+char(39)+@tbl+char(39)+', '
+char(39)+@col+char(39)+', '
if @id_present=1 set @sql=@sql+'IDENTITYCOL, '
else set @sql=@sql+'NULL, '
set @sql=@sql+'convert(varchar(7500),'+@col+') '
+'from '+@tbl+' (nolock) '
+'where convert(varchar(8000),'+@col+') like '+char(39)+@phrase+char(39)
end
if @OutFullRecords=1
begin
set @sql='if exists (select * from '+@tbl+' (nolock) '
+'where convert(varchar(8000),'+@col+') like '+char(39)+@phrase+char(39)+') '
+'select '+char(39)+@tbl+char(39)+' TableName, '+char(39)+@col+char(39)+' ColumnName, * '
+'from '+@tbl+' (nolock) where convert(varchar(8000),'+@col+') like '+char(39)+@phrase+char(39)
end
exec(@sql)
fetch CRR into @tbl, @col, @id_present
end
close CRR
deallocate CRR
if @OutFullRecords=0
begin
-- For the clients supporting new types:
--exec('select * from #tbl_res order by 1,2,3')
-- For the clients who are not supporting new types:
exec('select TableName, ColumnName, Id, convert(varchar(255),ColumnValue) ColumnValue from #tbl_res order by 1,2,3')
end
drop table #tbl_res
-------------------------------------------------------------------------------------------------------------------------------------------------
다른방법
-- 간단하게 테스트 삼아 만들어 봤습니다.
-- 테이블, 컬럼 추출
SELECT B.name AS TABLE_NAME, A.name AS COLUMN_NAME INTO #TMP FROM syscolumns A
INNER JOIN sysobjects B ON A.id = B.id AND B.type='u'
INNER JOIN systypes C ON A.xtype=C.xtype
AND C.name in ('text', 'ntext', 'char', 'nchar', 'varchar', 'nvarchar')
--- 특정테이블
DECLARE @tablename sysname
DECLARE @Where NVarchar(Max)
DECLARE @SQL NVARCHAR(Max)
DECLARE @SEARCH NVARCHAR(200)
SET @tablename = '테이블명'
SET @SEARCH = '가나다라'
SET @Where = ''
SELECT @Where = @Where + COLUMN_NAME + ' LIKE ''%' + @Search + '%'' OR ' FROM #TMP
WHERE TABLE_NAME = @tablename
SET @Where = LEFT(@Where, Len(@Where) - 3)
SET @SQL = 'SELECT * FROM ' + @tablename + ' WHERE '+@Where
EXEC SP_EXECUTESQL @SQL
------
-- 전체 테이블
DECLARE @tablename sysname
DECLARE @Where NVarchar(Max)
DECLARE @SQL NVARCHAR(Max)
DECLARE @SEARCH NVARCHAR(200)
SET @SEARCH = '가나다라'
DECLARE CUR_TABLE CURSOR
READ_ONLY FOR
SELECT TABLE_NAME FROM #TMP
GROUP BY TABLE_NAME
Open CUR_TABLE
FETCH NEXT FROM CUR_TABLE into @tablename
WHILE (@@fetch_status <> -1)
Begin
SET @WHERE = ''
SET @PARAMS = ''
SET @SQL = ''
SELECT @Where = @Where + COLUMN_NAME + ' LIKE ''%' + @Search + '%'' OR ' FROM #TMP
WHERE TABLE_NAME = @tablename
SET @Where = LEFT(@Where, Len(@Where) - 3)
IF Len(@Where ) > 0
Begin
SET @SQL = 'SELECT * FROM ' + @tablename + ' WHERE ' + @Where
EXEC SP_EXECUTESQL @SQL
End
FETCH NEXT FROM CUR_TABLE into @tablename
End
CLOSE CUR_TABLE
DEALLOCATE CUR_TABLE
'SQL' 카테고리의 다른 글
[MSSQL] 대문자 or 소문자 확인하기 (바이너리 이용) (0) | 2014.11.04 |
---|---|
[MSSQL] 반올림, 소수점 자르기 (0) | 2014.08.07 |
[MSSQL] 커서 (CURSOR) (0) | 2014.07.23 |
[MSSQL] 테이블 검색 (0) | 2014.07.09 |
[MSSQL] with(nolock) (0) | 2014.04.30 |