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