SQL String Search

by ssi 5. May 2015 14:32

USE [AMC_Support]

GO

 

/****** Object:  StoredProcedure [dbo].[usp_ssi_String_Search]    Script Date: 12/17/2015 14:32:03 ******/

SET ANSI_NULLS ON

GO

 

SET QUOTED_IDENTIFIER ON

GO

 

 

 

 

-----------------------------------------------------------------------------------------------------------------------------

--    Stored Procedure Details: Listing Of Standard Details Related To The Stored Procedure

-----------------------------------------------------------------------------------------------------------------------------

 

--    Purpose: Search For A String Value Within Columns Of Data Types CHAR, NCHAR, NTEXT, NVARCHAR, TEXT, VARCHAR, XML

--    Create Date (MM/DD/YYYY): 03/20/2012

--    Developer: Sean Smith (s.smith.sql AT gmail DOT com)

--    Additional Notes: N/A

 

 

-----------------------------------------------------------------------------------------------------------------------------

--    Modification History: Listing Of All Modifications Since Original Implementation

-----------------------------------------------------------------------------------------------------------------------------

 

--    Description: No Modifications To Date

--    Date (MM/DD/YYYY): N/A

--    Developer: N/A

--    Additional Notes: N/A

 

 

-----------------------------------------------------------------------------------------------------------------------------

--    Main Query: Create Procedure

-----------------------------------------------------------------------------------------------------------------------------

 

ALTER PROCEDURE [dbo].[usp_ssi_String_Search]

 

      @Search_String AS NVARCHAR (500)

      ,@Database_Name AS NVARCHAR (300)

      ,@Object_Types AS NVARCHAR (10) = NULL

      ,@Data_Types AS NVARCHAR (100) = NULL

      ,@Table_Max_Rows AS BIGINT = NULL

      ,@Column_Max_Length AS SMALLINT = NULL

 

WITH RECOMPILE

 

AS

 

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SET NOCOUNT ON

SET ANSI_WARNINGS OFF

SET ARITHABORT OFF

SET ARITHIGNORE ON

SET TEXTSIZE 2147483647

 

 

DECLARE

      @Loop_Column_Number AS BIGINT

      ,@Loop_Column_Number_First AS BIGINT

      ,@Loop_Object_Number AS BIGINT

      ,@Object_Name AS SYSNAME

      ,@Schema_Name AS SYSNAME

      ,@SQL_String_Full AS NVARCHAR (MAX)

      ,@SQL_String_IN_Column_Name AS NVARCHAR (MAX)

      ,@SQL_String_SELECT AS NVARCHAR (MAX)

      ,@SQL_String_WHERE AS NVARCHAR (MAX)

 

 

SET @Object_Types = N'''' + REPLACE (REPLACE (NULLIF (@Object_Types, N''), N' ', N''), N',', N''',''') + N''''

 

 

SET @Data_Types = N'''' + REPLACE (REPLACE (NULLIF (@Data_Types, N''), N' ', N''), N',', N''',''') + N''''

 

 

-----------------------------------------------------------------------------------------------------------------------------

--    Error Trapping I: Validate "@Search_String" And "@Database_Name" Input Parameter Values

-----------------------------------------------------------------------------------------------------------------------------

 

IF NULLIF (@Search_String, N'') IS NOT NULL

BEGIN

 

      SET @Search_String = REPLACE (REPLACE (REPLACE (REPLACE (@Search_String, N'[', N'[[]'), N'%', N'[%]'), N'_', N'[_]'), N'''', N'''''')

 

END

ELSE BEGIN

 

      RAISERROR

 

            (

                  N'ERROR: @Search_String input parameter cannot be blank or NULL.'

                  ,16

                  ,1

            )

 

 

      RETURN

 

END

 

 

IF EXISTS (SELECT * FROM master.sys.databases DB WHERE DB.name = @Database_Name)

BEGIN

 

      SET @Database_Name = QUOTENAME (@Database_Name)

 

END

ELSE IF EXISTS (SELECT * FROM master.sys.databases DB WHERE QUOTENAME (DB.name) = @Database_Name + N']')

BEGIN

 

      SET @Database_Name = @Database_Name + N']'

 

END

ELSE IF NOT EXISTS (SELECT * FROM master.sys.databases DB WHERE QUOTENAME (DB.name) = @Database_Name)

BEGIN

 

      RAISERROR

 

            (

                  N'ERROR: Database (''%s'') does not exist. Make sure that the name is entered correctly.'

                  ,16

                  ,1

                  ,@Database_Name

            )

 

 

      RETURN

 

END

 

 

-----------------------------------------------------------------------------------------------------------------------------

--    Error Trapping II: Check If Temp Table(s) Already Exist(s) And Drop If Applicable

-----------------------------------------------------------------------------------------------------------------------------

 

IF OBJECT_ID (N'tempdb.dbo.#temp_string_search_objects_columns', N'U') IS NOT NULL

BEGIN

 

      DROP TABLE dbo.#temp_string_search_objects_columns

 

END

 

 

IF OBJECT_ID (N'tempdb.dbo.#temp_string_search_results', N'U') IS NOT NULL

BEGIN

 

      DROP TABLE dbo.#temp_string_search_results

 

END

 

 

-----------------------------------------------------------------------------------------------------------------------------

--    Table Creation: Create Temp Tables To Temporarily Store Searchable Objects / Columns And Output Results

-----------------------------------------------------------------------------------------------------------------------------

 

CREATE TABLE dbo.#temp_string_search_objects_columns

 

      (

            object_type VARCHAR (2) NOT NULL

            ,data_type SYSNAME NOT NULL

            ,max_length SMALLINT NOT NULL

            ,[schema_name] SYSNAME NOT NULL

            ,[object_name] SYSNAME NOT NULL

            ,column_name SYSNAME NOT NULL

            ,schema_object_dense_rank BIGINT NOT NULL

            ,column_row_number BIGINT UNIQUE NOT NULL

            ,PRIMARY KEY CLUSTERED

                  (

                        schema_object_dense_rank

                        ,column_row_number

                  )

      )

 

 

CREATE TABLE dbo.#temp_string_search_results

 

      (

            [schema_name] SYSNAME NOT NULL

            ,[object_name] SYSNAME NOT NULL

            ,column_name SYSNAME NOT NULL

            ,column_data NVARCHAR (MAX) NOT NULL

            ,occurrences INT NOT NULL

      )

 

 

-----------------------------------------------------------------------------------------------------------------------------

--    Table Update I: Insert Searchable Objects / Columns Into Temp Table

-----------------------------------------------------------------------------------------------------------------------------

 

SET @SQL_String_Full =

 

      N'

            SELECT

                  O.[type] AS object_type

                  ,T.name AS data_type

                  ,C.max_length

                  ,S.name AS [schema_name]

                  ,O.name AS [object_name]

                  ,C.name AS column_name

                  ,DENSE_RANK () OVER

                                          (

                                                ORDER BY

                                                      S.name

                                                      ,O.name

                                          ) AS schema_object_dense_rank

                  ,ROW_NUMBER () OVER

                                          (

                                                ORDER BY

                                                      C.name

                                          ) AS column_row_number

            FROM

                  ' + @Database_Name + N'.sys.schemas S

                  INNER JOIN ' + @Database_Name + N'.sys.objects O ON O.[schema_id] = S.[schema_id]

                        AND O.[type] IN (' + (CASE

                                                            WHEN @Object_Types IS NOT NULL THEN @Object_Types

                                                            ELSE N'''U'', ''V'''

                                                            END) + N')

                  INNER JOIN ' + @Database_Name + N'.sys.columns C ON C.[object_id] = O.[object_id]

      '

 

 

IF @Column_Max_Length > 0

BEGIN

 

      SET @SQL_String_Full = @SQL_String_Full +

 

            N'

                  ' + NCHAR (9) + N'AND C.system_type_id IN (167, 175, 231, 239)

                  ' + NCHAR (9) + N'AND C.max_length BETWEEN 1 AND ' + CONVERT (NVARCHAR (6), @Column_Max_Length) + N'

            '

 

END

ELSE BEGIN

 

      SET @SQL_String_Full = @SQL_String_Full +

 

            N'

                  ' + NCHAR (9) + N'AND C.system_type_id IN (35, 99, 167, 175, 231, 239, 241)

            '

 

END

 

 

SET @SQL_String_Full = @SQL_String_Full +

 

      N'

                  INNER JOIN ' + @Database_Name + N'.sys.types T ON T.system_type_id = C.system_type_id

                        AND T.user_type_id = C.user_type_id

      ' + (CASE

                  WHEN @Data_Types IS NOT NULL THEN REPLICATE (NCHAR (9), 3) + N'AND T.name IN (' + @Data_Types + N')'

                  ELSE N''

                  END)

 

 

IF @Table_Max_Rows > 0

BEGIN

 

      SET @SQL_String_Full = @SQL_String_Full +

 

            N'

                  INNER JOIN

 

                        (

                              SELECT

                                    DDPS.[object_id]

                              FROM

                                    ' + @Database_Name + N'.sys.dm_db_partition_stats DDPS

                              WHERE

                                    DDPS.index_id < 2

                              GROUP BY

                                    DDPS.[object_id]

                              HAVING

                                    SUM (DDPS.row_count) <= ' + CONVERT (NVARCHAR (20), @Table_Max_Rows) + N'

                        ) sqTMR ON sqTMR.[object_id] = O.[object_id]

            '

 

END

 

 

INSERT INTO dbo.#temp_string_search_objects_columns

 

      (

            object_type

            ,data_type

            ,max_length

            ,[schema_name]

            ,[object_name]

            ,column_name

            ,schema_object_dense_rank

            ,column_row_number

      )

 

EXECUTE (@SQL_String_Full)

 

 

-----------------------------------------------------------------------------------------------------------------------------

--    Table Update II: Insert Matched Results Into Temp Table

-----------------------------------------------------------------------------------------------------------------------------

 

SELECT TOP (1)

      @Loop_Object_Number = X.schema_object_dense_rank

      ,@Schema_Name = X.[schema_name]

      ,@Object_Name = X.[object_name]

FROM

      dbo.#temp_string_search_objects_columns X

ORDER BY

      X.schema_object_dense_rank

 

 

WHILE @Loop_Object_Number IS NOT NULL

BEGIN

 

      SET @SQL_String_SELECT = N''

 

 

      SET @SQL_String_IN_Column_Name = N''

 

 

      SET @SQL_String_WHERE = N''

 

 

      SET @Loop_Column_Number = (SELECT MIN (X.column_row_number) FROM dbo.#temp_string_search_objects_columns X WHERE X.schema_object_dense_rank = @Loop_Object_Number)

 

 

      SET @Loop_Column_Number_First = @Loop_Column_Number

 

 

      WHILE @Loop_Column_Number IS NOT NULL

      BEGIN

 

            SELECT

                  @SQL_String_SELECT = @SQL_String_SELECT + (CASE

                                                                                          WHEN @Loop_Column_Number = @Loop_Column_Number_First THEN N'SELECT' + NCHAR (13) + REPLICATE (NCHAR (9), 7) + N' '

                                                                                          ELSE NCHAR (13) + REPLICATE (NCHAR (9), 7) + N','

                                                                                          END) + N'CONVERT (NVARCHAR (MAX), (CASE

                                                                                                                                                      WHEN ' + (CASE

                                                                                                                                                                        WHEN X.data_type = N'XML' THEN N'CONVERT (NVARCHAR (MAX), '

                                                                                                                                                                        ELSE N''

                                                                                                                                                                        END) + QUOTENAME (X.column_name) + (CASE

                                                                                                                                                                                                                                    WHEN X.data_type = N'XML' THEN N')'

                                                                                                                                                                                                                                    ELSE N''

                                                                                                                                                                                                                                    END) + N' LIKE ''%' + @Search_String + N'%'' THEN ' + QUOTENAME (X.column_name) + N'

                                                                                                                                                      ELSE NULL

                                                                                                                                                      END)) AS ' + QUOTENAME (X.column_name)

                  ,@SQL_String_IN_Column_Name = @SQL_String_IN_Column_Name + (CASE

                                                                                                                  WHEN @Loop_Column_Number = @Loop_Column_Number_First THEN N''

                                                                                                                  ELSE N', '

                                                                                                                  END) + QUOTENAME (X.column_name)

                  ,@SQL_String_WHERE = @SQL_String_WHERE + (CASE

                                                                                    WHEN @Loop_Column_Number = @Loop_Column_Number_First THEN NCHAR (13) + REPLICATE (NCHAR (9), 6) + N'WHERE' + NCHAR (13) + REPLICATE (NCHAR (9), 7)

                                                                                    ELSE NCHAR (13) + REPLICATE (NCHAR (9), 7) + N'OR '

                                                                                    END) + (CASE

                                                                                                      WHEN X.data_type = N'XML' THEN N'CONVERT (NVARCHAR (MAX), '

                                                                                                      ELSE N''

                                                                                                      END) + QUOTENAME (X.column_name) + (CASE

                                                                                                                                                                  WHEN X.data_type = N'XML' THEN N')'

                                                                                                                                                                  ELSE N''

                                                                                                                                                                  END) + N' LIKE ''%' + @Search_String + N'%'''

            FROM

                  dbo.#temp_string_search_objects_columns X

            WHERE

                  X.schema_object_dense_rank = @Loop_Object_Number

                  AND X.column_row_number = @Loop_Column_Number

 

 

            SET @Loop_Column_Number = (SELECT MIN (X.column_row_number) FROM dbo.#temp_string_search_objects_columns X WHERE X.schema_object_dense_rank = @Loop_Object_Number AND X.column_row_number > @Loop_Column_Number)

 

      END

 

 

      SET @SQL_String_Full =

 

            (

                  N'

                        SELECT

                              ''' + @Schema_Name + N''' AS [schema_name]

                              ,''' + @Object_Name + N''' AS [object_name]

                              ,UNPV.column_name

                              ,UNPV.column_data

                              ,COUNT (*) AS occurrences

                        FROM

 

                              (

                                    '

                                          + @SQL_String_SELECT

                                          + NCHAR (13) + REPLICATE (NCHAR (9), 6) + N'FROM' + NCHAR (13)

                                          + REPLICATE (NCHAR (9), 7) + @Database_Name

                                          + N'.'

                                          + QUOTENAME (@Schema_Name)

                                          + N'.'

                                          + QUOTENAME (@Object_Name)

                                          + @SQL_String_WHERE

                                    + N'

                              ) sqMAT

 

                        UNPIVOT

 

                              (

                                    column_data FOR column_name IN

 

                                          (

                                                ' + @SQL_String_IN_Column_Name + N'

                                          )

 

                              ) UNPV

 

                        GROUP BY

                              UNPV.column_name

                              ,UNPV.column_data

                  '

            )

 

 

      BEGIN TRY

 

            INSERT INTO dbo.#temp_string_search_results

 

                  (

                        [schema_name]

                        ,[object_name]

                        ,column_name

                        ,column_data

                        ,occurrences

                  )

 

            EXECUTE (@SQL_String_Full)

 

      END TRY

      BEGIN CATCH

 

      END CATCH

 

 

      SELECT TOP (1)

            @Loop_Object_Number = X.schema_object_dense_rank

            ,@Schema_Name = X.[schema_name]

            ,@Object_Name = X.[object_name]

      FROM

            dbo.#temp_string_search_objects_columns X

      WHERE

            X.schema_object_dense_rank = @Loop_Object_Number + 1

      ORDER BY

            X.schema_object_dense_rank

 

 

      IF @@ROWCOUNT = 0

      BEGIN

 

            SET @Loop_Object_Number = NULL

 

      END

 

END

 

 

-----------------------------------------------------------------------------------------------------------------------------

--    Main Query: Final Display / Output

-----------------------------------------------------------------------------------------------------------------------------

 

SELECT

      (CASE Y.object_type

            WHEN 'U' THEN 'TABLE'

            WHEN 'V' THEN 'VIEW'

            ELSE 'ERROR'

            END) AS object_type

      ,UPPER (Y.data_type) AS data_type

      ,Y.max_length AS data_length

      ,DB_NAME (DB_ID (SUBSTRING (@Database_Name, 2, LEN (@Database_Name) - 2))) AS database_name

      ,Y.[schema_name]

      ,Y.[object_name]

      ,Y.column_name

      ,Z.column_data

      ,CONVERT (XML, (CASE Y.data_type

                                    WHEN N'XML' THEN Z.column_data

                                    ELSE N''

                                    END)) AS column_data_xml

      ,Z.occurrences

FROM

      dbo.#temp_string_search_objects_columns Y

      INNER JOIN dbo.#temp_string_search_results Z ON Z.[schema_name] = Y.[schema_name]

            AND Z.[object_name] = Y.[object_name]

            AND Z.column_name = Y.column_name

ORDER BY

      Y.[schema_name]

      ,Y.[object_name]

      ,Y.column_name

      ,Z.column_data

 

 

-----------------------------------------------------------------------------------------------------------------------------

--    Cleanup: Drop Any Remaining Temp Tables

-----------------------------------------------------------------------------------------------------------------------------

 

IF OBJECT_ID (N'tempdb.dbo.#temp_string_search_objects_columns', N'U') IS NOT NULL

BEGIN

 

      DROP TABLE dbo.#temp_string_search_objects_columns

 

END

 

 

IF OBJECT_ID (N'tempdb.dbo.#temp_string_search_results', N'U') IS NOT NULL

BEGIN

 

      DROP TABLE dbo.#temp_string_search_results

 

END

 

 

GO

 

 

Tags: , ,

SQL

sp_ssiFind_DbObjects

by ssi 8. November 2013 07:41

/*

      Name: p_Find_DbObjects

      Parameters:

       @string - String/Part of string for DB Object you want to search.

      Description: This procedure will allow you to find any string in any DB Object with its name or part of its name.

            It will also allow you to find the column name belongs to which tables, TV functions and Views.

*/

CREATE PROCEDURE [dbo].[sp_ssiFind_DbObjects]

@string NVARCHAR(MAX) = ''

AS

BEGIN

     

      SET NOCOUNT ON

      SET ANSI_WARNINGS OFF

     

      -- Returns list of DB objects containing the string in their definition and/or in their name.

      SELECT [DB_ObjName] = OBJECT_SCHEMA_NAME(sm.[object_id]) + '.' + OBJECT_NAME(sm.[object_id]), so.type_desc [DB_ObjType],

       (LEN(sm.[definition]) - LEN(REPLACE(sm.[definition], CHAR(10), ''))) Lines_of_Code

      FROM SYS.SQL_MODULES sm

      INNER JOIN SYS.OBJECTS so

            ON sm.[OBJECT_ID] = so.[OBJECT_ID]

      WHERE sm.[definition] LIKE N'%' + @string + '%'

      OR so.[name] like N'%' + @string + '%'

      GROUP BY sm.[object_id], so.type_desc,sm.[definition]

      ORDER BY [DB_ObjName], [DB_ObjType];

     

      SET NOCOUNT OFF

      SET ANSI_WARNINGS ON

     

END

 

--exec [sp_ssiFind_DbObjects] 'vu_ssi_metrics'

 

Tags:

SQL

handy function for converting date formats

by ssi 30. April 2013 20:31

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE FUNCTION [dbo].[uf_ssi_DateFormat] (@Datetime DATETIME, @Format VARCHAR(32))

RETURNS VARCHAR(32)

AS

BEGIN

    DECLARE @DateValue VARCHAR(32)

   

    SET @DateValue = @Format

   

    IF (CHARINDEX ('YYYY',@DateValue) > 0)

       SET @DateValue = REPLACE(@DateValue, 'YYYY',

                         DATENAME(YY, @Datetime))

    IF (CHARINDEX ('YY',@DateValue) > 0)

       SET @DateValue = REPLACE(@DateValue, 'YY',

                         RIGHT(DATENAME(YY, @Datetime),2))

    IF (CHARINDEX ('Month',@DateValue) > 0)

       SET @DateValue = REPLACE(@DateValue, 'Month',

                         DATENAME(MM, @Datetime))

    IF (CHARINDEX ('MON',@DateValue)>0)

       SET @DateValue = REPLACE(@DateValue, 'MON',

                         LEFT(UPPER(DATENAME(MM, @Datetime)),3))

    IF (CHARINDEX ('Mon',@DateValue) > 0)

       SET @DateValue = REPLACE(@DateValue, 'Mon',

                          LEFT(DATENAME(MM, @Datetime),3))

    IF (CHARINDEX ('MM',@DateValue) > 0)

       SET @DateValue = REPLACE(@DateValue,'MM',

                                      RIGHT('0'+CONVERT(VARCHAR,DATEPART(MM, @Datetime)),2))

    IF (CHARINDEX ('M',@DateValue) > 0)

       SET @DateValue = REPLACE(@DateValue,'M',

                         CONVERT(VARCHAR,DATEPART(MM, @Datetime)))

    IF (CHARINDEX ('DD',@DateValue) > 0)

       SET @DateValue = REPLACE(@DateValue, 'DD',

                         RIGHT(0+DATENAME(DD, @Datetime),2))

    IF (CHARINDEX ('D',@DateValue) > 0)

       SET @DateValue = REPLACE(@DateValue,'D',

                                     DATENAME(DD, @Datetime))  

RETURN @DateValue

END

 

Ross Mason
Software Development

CADENCE BANK, N.A.
3700 Colonnade Parkway, Suite 200
Birmingham, AL  35243
T 205-949-9716
F n/a

ross.mason@cadencebank.com


Confidentiality Disclosure Notice: The information contained in this email is legally privileged and confidential information for the sole use of the intended recipient. Any use, distribution, transmittal or re-transmittal of information contained in this email by persons who are not intended recipients may be a violation of law and is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.

 

 

Tags: ,

SQL

Calendar

<<  May 2024  >>
MoTuWeThFrSaSu
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

View posts in large calendar

RecentComments

None

Development Team @ Shelbysys

We develop custom database applications for our clients. Our development tool of choice is MS Visual Studio. 

Quotations

"Procrastination is, hands down, our favorite form of self-sabotage"
Alyce P. Cornyn-Selby