2015-06-23 2 views
0

Прежде всего, мои извинения, если этот вопрос был задан раньше, но я сделал все возможное, чтобы искать, но не увенчался успехом. Теперь у меня есть хранимая процедура (см. Ниже), которая ищет все столбцы всех таблиц в базе данных для ключевого слова.Как удалить некоторые записи из моего набора результатов sql, если они содержат некоторые конкретные числовые символы?

CREATE PROC SearchAllTables(@SearchStr nvarchar(100)) AS 
BEGIN 
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') 
       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 ColumnName, ColumnValue FROM #Results 
END 

И мы я использую этот зр искать все colums всех таблиц, если они содержат строку «134». Затем я получил результат в ответ такой:

ColumnValue

1) 313472

2) C0134G332

3) CAB134BNH

4) 134AAABBBCCC

5) 134AAAABBB134

Наконец, я хочу 3-й и 4-й, я просто хочу, чтобы моя запись содержала только 134 в виде числовых символов, и каждый из них может отображаться только в строке один раз (так что 5-й не приемлем). Я просто хочу исключить записи, содержащие любые другие числовые символы, чем «134». Любая помощь будет оценена по достоинству. Тонкс!

+0

Какие СУБД вы используете? (Не похож на ANSI SQL ...) – jarlh

+0

Я использую MS SQL Server – Can

ответ

0

Вы можете использовать LIKE '%[0-9]%', чтобы определить, содержит ли строка число. Поэтому вам просто нужно удалить первый экземпляр SearchStr из столбца. Вы можете использовать

STUFF(ColumnName, CHARINDEX(ColumnName, SearchStr), LEN(SearchStr), '')

, чтобы сделать это. Это оставит вас с чем-то вроде

AND STUFF(ColumnName, CHARINDEX(ColumnName, SearchStr), LEN(SearchStr), '') NOT LIKE '%[0-9]%'

0
select * 
from test 
Where ((ColumnValue like '%[^0-9]134[^0-9]%' 
    OR ColumnValue like '134[^0-9]%' 
    OR ColumnValue like '%[^0-9]134') 
AND (ColumnValue NOT like '%134%134%')); 
Смежные вопросы