Register for your free account! | Forgot your password?

You last visited: Today at 10:53

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[SQL]SPFINDSTRING

Discussion on [SQL]SPFINDSTRING within the SRO PServer Guides & Releases forum part of the SRO Private Server category.

Reply
 
Old   #1
 
IceAmStiel's Avatar
 
elite*gold: 0
Join Date: Jul 2011
Posts: 1,058
Received Thanks: 1,118
[SQL]SPFINDSTRING

Might be of use for someone..hopefully ;d

Aight.. it's a tiny cheesy script, not really sro-related, so feel free to move it if you find an appropriate section for it.

It's basically a way to find a given string (numerals work as well) in certain database objects which are here functions, procedures, triggers and tables.


I won't explain you in detail what it does and how it works, you should just run and play with it.


I'll give you an example anyhow..



31 = 1 (Function) + 2 (Procedure) + 4 (Trigger) + 8 (Table; String Columns) + 16 (Table; Numeric)

16 (Table; Numeric) is in the output excluded since 'char' isn't a numeric value.


Code:
CREATE PROCEDURE [dbo].[SPFINDSTRING]	/*
	by Caipi
	
	1		»	Function
	2		»	Procedure
	4		»	Trigger
	8		»	Table (String)
	16		»	Table (Numeric)
*/

	@SEEK	nvarchar(128),
	@Types	tinyint

as

SET NOCOUNT ON;

IF (LEN(@SEEK) = 0)
	BEGIN
		RAISERROR('Invalid SEEK length', 10, 1);
		RETURN -1;
	END
ELSE IF ((@Types & (1 | 2 | 4 | 8 | 16)) = 0)
	BEGIN
		RAISERROR('Invalid Types', 10, 1);
		RETURN -2;
	END

Declare	@String		nvarchar(max),
		@obj_ID		int,
		@col_ID		int,
		@min_Hits	int,
		@obj_Type	nvarchar(2),
		@obj_Name	nvarchar(128),
		@col_Name	nvarchar(128);
SELECT	@String		= N'',
		@min_Hits	= 0;

Declare	@tbl_POOL		TABLE(ObjectID int, ObjectName nvarchar(128), ObjectType nvarchar(2));
Declare	@tbl_Results	TABLE(ObjectID int, ObjectName nvarchar(128), ObjectType nvarchar(16), Keyword nvarchar(128), ColumnName nvarchar(128) NULL, min_Hits INT, Query nvarchar(max));

INSERT INTO	@tbl_POOL
SELECT		[object_id],
			[name], 
			[type]		FROM sys.objects WHERE [type] in	(	CASE WHEN @Types & 1	!= 0 THEN N'FN'	ELSE N'' END,
																CASE WHEN @Types & 2	!= 0 THEN N'P'	ELSE N'' END,
																CASE WHEN @Types & 4	!= 0 THEN N'TR'	ELSE N'' END,
																CASE WHEN @Types & 8	!= 0 THEN N'U'	ELSE N'' END,
																CASE WHEN @Types & 16	!= 0 THEN N'U'	ELSE N'' END	);

SELECT	@obj_ID = MIN(ObjectID) FROM @tbl_POOL;

while (@obj_ID is not null)
	BEGIN
		SELECT	@obj_Type = ObjectType,
				@obj_Name = ObjectName	FROM @tbl_POOL WHERE ObjectID = @obj_ID;
		
		IF (@obj_Type in (N'FN', N'P', N'TR'))
			BEGIN
				SELECT	@String = N'';
				SELECT	@String = @String + [text] FROM syscomments WHERE id = @obj_ID;
				
				IF (CHARINDEX(@SEEK, @String) > 0)
					BEGIN
						INSERT INTO @tbl_Results	SELECT @obj_ID, @obj_Name,	CASE
																					WHEN @obj_Type = 'FN'	THEN N'Function'
																					WHEN @obj_Type = 'P'	THEN N'Procedure'
																					WHEN @obj_Type = 'TR'	THEN N'Trigger'
																				END, @SEEK, N'', 1, N'';
					END
			END
		ELSE IF (@obj_Type = N'U' AND @Types & 8 != 0)
			BEGIN
				SELECT	@col_ID = MIN(column_id) FROM sys.columns WHERE [object_id] = @obj_ID AND collation_name is not null;
				
				while (@col_ID is not null)
					BEGIN
						SELECT	@col_Name = name FROM sys.columns WHERE column_id = @col_ID AND [object_id] = @obj_ID;
						SELECT	@String = N'';
						SELECT	@String = N'SELECT @Q = COUNT(1) FROM dbo.' + @obj_Name + N' with(NOLOCK) WHERE CHARINDEX(''' + @SEEK + N''', [' + @col_Name + N']) > 0';
						
						exec	sp_executesql @String, N'@Q INT OUTPUT', @min_Hits OUTPUT;
						
						IF (@min_Hits > 0)
							BEGIN
								INSERT INTO @tbl_Results	SELECT @obj_ID, @obj_Name, 'User_Table', @SEEK, @col_Name, @min_Hits, 'SELECT * FROM dbo.' + @obj_Name + ' with(NOLOCK) WHERE CHARINDEX(''' + @SEEK + N''', [' + @col_Name + N']) > 0';
							END
						
						SELECT	@col_ID		= MIN(column_id),
								@col_Name	= NULL,
								@min_Hits	= 0 FROM sys.columns WHERE [object_id] = @obj_ID AND collation_name is not null AND column_id > @col_ID;
					END		
			END
		ELSE IF (@obj_Type = N'U' AND @Types & 16 != 0 AND ISNUMERIC(@SEEK) = 1)
			BEGIN
				SELECT	@col_ID = MIN(column_id) FROM sys.columns WHERE [object_id] = @obj_ID AND system_type_id in (127, 122, 108, 106, 62, 60, 59, 48, 52, 56);
				
				while (@col_ID is not null)
					BEGIN
						SELECT	@col_Name = name FROM sys.columns WHERE column_id = @col_ID AND [object_id] = @obj_ID;
						SELECT	@String = N'';
						SELECT	@String = N'SELECT @Q = COUNT(1) FROM dbo.' + @obj_Name + N' with(NOLOCK) WHERE [' + @col_Name + N'] = ' + @SEEK;
						
						exec	sp_executesql @String, N'@Q INT OUTPUT', @min_Hits OUTPUT;
						
						IF (@min_Hits > 0)
								BEGIN
									INSERT INTO @tbl_Results	SELECT @obj_ID, @obj_Name, 'User_Table', @SEEK, @col_Name, @min_Hits, 'SELECT * FROM dbo.' + @obj_Name + ' with(NOLOCK) WHERE [' + @col_Name + N'] = ' + @SEEK;
								END
							
							SELECT	@col_ID		= MIN(column_id),
									@col_Name	= NULL,
									@min_Hits	= 0 FROM sys.columns WHERE [object_id] = @obj_ID AND system_type_id in (127, 122, 108, 106, 62, 60, 59, 48, 52, 56) AND column_id > @col_ID;						
					END
			END
		
		SELECT	@obj_ID = MIN(ObjectID) FROM @tbl_POOL WHERE ObjectID > @obj_ID;
	END

SELECT * FROM @tbl_Results ORDER BY ObjectType, ObjectID;

SET NOCOUNT OFF;

RETURN 1;

It's written and tested on MSSQL 2008 R2; wrote it like a month ago or something. Have a nice one!

I attached the script with proper formattings ("[CODE]" screws it) below..



PS.: I welcome every public display of my mistakes and complications I made in my script.
Attached Files
File Type: txt sp_SPFINDSTRING.txt (4.4 KB, 8 views)
IceAmStiel is offline  
Thanks
3 Users
Old 04/24/2013, 19:05   #2
Chat Killer In Duty


 
PortalDark's Avatar
 
elite*gold: 5
Join Date: May 2008
Posts: 16,397
Received Thanks: 6,509
#approved
PortalDark is offline  
Old 04/24/2013, 23:58   #3
 
gigola123's Avatar
 
elite*gold: 0
Join Date: Jun 2007
Posts: 722
Received Thanks: 390
Really nice thanks caipi , I was searching of that before , and thought it didn't exist , but it does . Great !
gigola123 is offline  
Old 04/25/2013, 12:53   #4
 
elite*gold: 0
Join Date: Feb 2008
Posts: 962
Received Thanks: 650
Thanks.
I used to use something like this and it was working perfectily.
PHP Code:
SELECT  ROUTINE_NAME ROUTINE_DEFINITION  FROM  INFORMATION_SCHEMA.ROUTINES  WHERE  ROUTINE_DEFINITION  LIKE ' %string% ' AND   ROUTINE_TYPE 'PROCEDURE ' 
magicanoo is offline  
Old 04/25/2013, 14:40   #5
 
IceAmStiel's Avatar
 
elite*gold: 0
Join Date: Jul 2011
Posts: 1,058
Received Thanks: 1,118
Quote:
Originally Posted by magicanoo View Post
Thanks.
I used to use something like this and it was working perfectily.
PHP Code:
SELECT  ROUTINE_NAME ROUTINE_DEFINITION  FROM  INFORMATION_SCHEMA.ROUTINES  WHERE  ROUTINE_DEFINITION  LIKE ' %string% ' AND   ROUTINE_TYPE 'PROCEDURE ' 
Compare the output of the following queries»

Code:
SELECT	ROUTINE_NAME, ROUTINE_DEFINITION, LEN(ROUTINE_DEFINITION) FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'Procedure' AND ROUTINE_NAME = '_AddNewChar';
Code:
SELECT OBJECT_NAME(id), [text], LEN([text]) FROM syscomments WHERE id = OBJECT_ID('_AddNewChar');
IceAmStiel is offline  
Old 04/25/2013, 22:20   #6
 
Kape7's Avatar
 
elite*gold: 0
Join Date: Dec 2007
Posts: 3,210
Received Thanks: 6,301
Bad dentist
Kape7 is offline  
Old 04/26/2013, 01:30   #7
 
IceAmStiel's Avatar
 
elite*gold: 0
Join Date: Jul 2011
Posts: 1,058
Received Thanks: 1,118
Quote:
Originally Posted by Synx7 View Post
Bad dentist
Oke, you're not going to get your golden ivories.
IceAmStiel is offline  
Old 04/27/2013, 01:15   #8
 
elite*gold: 460
Join Date: Jul 2012
Posts: 394
Received Thanks: 272
Bad
Alexiuns is offline  
Old 05/01/2013, 15:40   #9
 
elite*gold: 0
Join Date: Feb 2012
Posts: 75
Received Thanks: 0
hmmmm
spider560 is offline  
Reply




All times are GMT +1. The time now is 10:55.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.