搜索數據庫表對象中包含特定字符串

Create Proc [dbo].[Upc_SearchTextOnDB]
(
	@SearchText nvarchar(100)
)
AS
BEGIN
	SET NOCOUNT ON
	Declare @LoopID int 
			,@StrSQL nvarchar(max)
			,@TabName nvarchar(100)
			,@TempStr nvarchar(100)
			,@WhereStr nvarchar(max)
			,@HasRow	int 
	set @HasRow = 0
	IF(OBJECT_ID('Tempdb.dbo.#Tab') IS NOT NULL)	
	BEGIN
		DROP TABLE #Tab;
	END
	Create table #Tab
	(
		ID int identity(1,1) primary key,
		TabName nvarchar(100),
		HasRow int default 0 not null,
		StrSQL nvarchar(max)
	)
	insert into #Tab(TabName)		
	select A.name from sys.tables A 
	where is_ms_shipped = 0
		and exists
		(
			select 1 from sys.columns where object_id = A.object_id and system_type_id in(99,167,175,231,239)
		)
	SET @LoopID = @@ROWCOUNT;
	WHILE(@LoopID >1)
	BEGIN
		SELECT @TabName = TabName FROM #Tab WHERE ID = @LoopID
		SET @TempStr = N' or ';
		
		SET @WhereStr = Stuff(Isnull((select @TempStr+N'['+B.name +N']'+N' like N'''+@SearchText+'%'''
										from sys.tables A,sys.columns B 
										where B.object_id = A.object_id and B.system_type_id in(99,167,175,231,239) 
											and is_ms_shipped = 0
											and A.name =@TabName
										for xml path('')),N''),1,LEN(@TempStr),N'')
		set @HasRow = 0;	
		SET @StrSQL = N'SELECT @HasRow = count(1) FROM ['+@TabName+'] WHERE '+@WhereStr
		Print @StrSQL
		EXEC SP_EXECUTESQL @StrSQL,N'@HasRow int output',@HasRow OUTPUT
		
		--SET @StrSQL = N'SELECT TOP 1 @HasRowOUT = 1 FROM @Table WHERE @Where'
		--EXEC SP_EXECUTESQL @StrSQL,N'@Table nvarchar(100),@Where nvarchar(max),@HasRowOUT bit output',@Table = @TabName,@Where = @WhereStr,@HasRowOUT = @HasRow OUTPUT
		IF(@HasRow >0)										
		BEGIN
			UPDATE #Tab SET HasRow = @HasRow 
						,StrSQL = @StrSQL
			WHERE ID = @LoopID
		END
		SET @LoopID = @LoopID -1;
	END
	SELECT TabName,HasRow,@SearchText, StrSQL FROM #Tab WHERE HasRow >0
	TRUNCATE TABLE #Tab;
	DROP TABLE #Tab;
	SET NOCOUNT OFF
END

GO

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章