如果它们包含一些特定的数字字符,如何从我的sql结果集中删除一些记录?

时间:2015-06-23 13:48:37

标签: sql sql-server database stored-procedures

首先,如果我之前已经问过这个问题,我很抱歉,但我已尽力搜索但未成功。 现在,我有一个存储过程(可以在下面看到),它搜索数据库中所有表的所有列以查找关键字。

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

我们使用此sp来搜索所有表格的所有列,如果它们包含字符串' 134'。然后我得到了一个结果:

ColumnValue

1)313472

2)C0134G332

3)CAB134BNH

4)134AAABBBCCC

5)134AAAABBB134

最后,我想要第3个和第4个,我只是希望我的记录只包含134作为数字字符,并且每个字符只能出现在字符串中一次(所以第5个不可接受)。我只想删除包含除#134; 134'之外的任何其他数字字符的记录。 任何帮助,将不胜感激。 Thanx!

3 个答案:

答案 0 :(得分:0)

isnumeric应该处理您想要过滤掉数字字符串的情况。

更多信息: https://technet.microsoft.com/en-us/library/ms186272%28v=sql.110%29.aspx

其中foo不喜欢'%123%123%'和foo喜欢'%123%'应该过滤掉重复项。

答案 1 :(得分:0)

您可以使用LIKE '%[0-9]%'来确定字符串是否包含数字。所以你只需要从列中删除SearchStr的第一个实例。你可以使用

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

这样做。这将为您留下类似

的内容

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

答案 2 :(得分: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%'));