2016-11-14 4 views
3

У нас есть база данных с большим количеством SP и просмотров, большинство из которых великолепны, но некоторые из них имеют изворотливые критерии (которые предыдущий сотрудник передал из MS Access с помощью программы перевода).В SSMS, как я могу найти строку, содержащую звездочку, какой-то текст, а затем еще одну звездочку?

Например, есть СФС critera как:

WHERE dbo.something NOT LIKE '*TEST*' 

Лицо, что установить это означало:

WHERE dbo.something NOT LIKE '%TEST%' 

Я нашел несколько уже используют этот метод, но я вам пришлось вводить точный текст. Замена слова TEST символом% не работает (% возвращает 0 записей, TEST возвращает некоторые записи).

USE [databasename] 
SELECT @SEARCHSTRING = '*TEST*', @notcontain = '' 

SELECT DISTINCT sysobjects.name AS [Object Name] 
,case when sysobjects.xtype = 'P' then 'Stored Proc' 
when sysobjects.xtype = 'TF' then 'Function' 
when sysobjects.xtype = 'TR' then 'Trigger' 
when sysobjects.xtype = 'V' then 'View' 
end as [Object Type] 
,USER_NAME(sysobjects.uid) AS trigger_owner 
--,s.name AS table_schema 
,OBJECT_NAME(parent_obj) AS table_name 
FROM sysobjects,syscomments 
WHERE sysobjects.id = syscomments.id 
AND sysobjects.type in ('P','TF','TR','V') 
AND sysobjects.category = 0 
AND CHARINDEX(@SEARCHSTRING,syscomments.text)>0 
AND ((CHARINDEX(@notcontain,syscomments.text)=0 
or CHARINDEX(@notcontain,syscomments.text)<>0)) 

Я хотел бы знать, если кто-нибудь знает, каким образом я могу найти строку, во всех объектах, которая имеет звездочку, текст и другую звездочку. Thanks v much

+0

Как раз так мы поняли, можете ли вы привести несколько примеров текста, который вы хотите сопоставить? И некоторые случаи краев того, что вы не хотите сопоставлять? – Bohemian

+0

Пробовал ли вы ... ... syscomments.text LIKE N '% * TEST *%' 'или' ... syscomments.text LIKE N '% *% *%' '...? –

+0

@GordThompson Привет, Горд, Да, я уже пробовал оба из них, но ничего не ответил, тогда как если я использую «% * TEST *%», я могу идентифицировать несколько хранимых процедур. –

ответ

0

Это было дано мне другим разработчиком. Может быть, это будет трюк?

DECLARE @SearchStr nvarchar(100) 
SET @SearchStr = 'Coincide'--'Absolute Value of the Difference' --'DOIRteDc' --'Smartin1' -- 'Rgillesp'--'--'## YOUR STRING HERE ##' 

-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved. 
-- Purpose: To search all columns of all tables for a given search string 
-- Written by: Narayana Vyas Kondreddi 
-- Site: http://vyaskn.tripod.com 
-- Updated and tested by Tim Gaunt 
-- http://www.thesitedoctor.co.uk 
-- http://blogs.thesitedoctor.co.uk/tim/2010/02/19/Search+Every+Table+And+Field+In+A+SQL+Server+Database+Updated.aspx 
-- Tested on: SQL Server 7.0, SQL Server 2000, SQL Server 2005 and SQL Server 2010 
-- Date modified: 03rd March 2011 19:00 GMT 
CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630)) 

SET NOCOUNT ON 

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110) 
SET @TableName = '' 
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''') 

WHILE @TableName IS NOT NULL 

BEGIN 
    SET @ColumnName = '' 
    SET @TableName = 
    (
     SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) 
     FROM  INFORMATION_SCHEMA.TABLES 
     WHERE   TABLE_TYPE = 'BASE TABLE' 
      AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName 
      AND OBJECTPROPERTY(
        OBJECT_ID(
         QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) 
         ), 'IsMSShipped' 
          ) = 0 
    ) 

    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) 

    BEGIN 
     SET @ColumnName = 
     (
      SELECT MIN(QUOTENAME(COLUMN_NAME)) 
      FROM  INFORMATION_SCHEMA.COLUMNS 
      WHERE   TABLE_SCHEMA = PARSENAME(@TableName, 2) 
       AND TABLE_NAME = PARSENAME(@TableName, 1) 
       AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal') 
       AND QUOTENAME(COLUMN_NAME) > @ColumnName 
     ) 

     IF @ColumnName IS NOT NULL 

     BEGIN 
      INSERT INTO #Results 
      EXEC 
      (
       'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' + 
       ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 
      ) 
     END 
    END  
END 

SELECT distinct ColumnName, ColumnValue FROM #Results 

DROP TABLE #Results 
+0

Привет, Duston, спасибо за ваше предложение, но это не совсем то, что мне нужно. Мне нужен некоторый SQL, чтобы идентифицировать строки с Asterisk, затем некоторый текст, затем еще одну звездочку. –

+0

Разве вы не можете использовать это и просто изменить строку SeachStr2? – Duston

+0

Возможно, Duston, но я не могу просто изменить содержимое SearchStr2 (в вашем случае строка, состоящая из слова «Coincide», в моем случае строка из звездочки и звездочки, некоторый текст и другая звездочка. Обычно я писал бы это как '*% *', но SQL-сервер в этом случае не распознает символ% как wild card, как обычно.Я уверен, что мой синтаксис неверен, но я не уверен, что еще попробовать. благодаря –

0

Я знаю, что вопрос был задан давно, но Heres возможным простое решение на ваш вопрос :::

select sys.objects.name,sys.objects.type_desc, syscomments.id from sys.objects 
inner join 
syscomments 
    on sys.objects.object_id = syscomments.id 
WHERE syscomments.text like '%[^/]*%*[^/]%' --here the * that is following the/and preceding /has been ignored because i dont think you want to replace the comments that has /* ....... */ 

надеюсь, что это поможет вам!