是否可以在Microsoft SQL Server管理器中搜索记录?
我的意思是在VS按 Ctrl-F 并按字搜索?
答案 0 :(得分:0)
在SQL Server管理工作室中搜索对象是无法实现的。有些视图和表可用于搜索对象,如:
SELECT * FROM sys.tables WHERE name LIKE '%...%'
搜索表格。
如果您的意思是,在表格中搜索数据,我需要学习T-SQL。
答案 1 :(得分:0)
有非免费的第三方工具(例如Redgate的SQL搜索),但我使用下面的proc。您必须在每个[master]数据库中创建proc,以便它在服务器范围内可用,但您可以传入搜索项和可选的数据库名称(否则它将搜索所有数据库中的对象定义):
USE [master]
GO
/****** Object: StoredProcedure [dbo].[sp_FindTextOnServer] Script Date: 10/6/2017 3:39:19 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*-----------------------------------------------------------
This procedure will search all or a specified database objects
for the supplied text and return a table with the values
Examples:
EXEC sp_FindTextOnServer 'Billing', 'fcsCore'
EXEC sp_FindTextOnServer 'vJurisdiction'
-----------------------------------------------------------*/
ALTER PROCEDURE [dbo].[sp_FindTextOnServer]
@text VARCHAR(40),
@searchDB VARCHAR(100) = NULL
AS
DECLARE @DisplayText VARCHAR(100),
@sSql VARCHAR(1000),
@line VARCHAR(300),
@char CHAR,
@lineNo INTEGER,
@counter INTEGER,
@AddedRecord BIT,
@dbObjectType VARCHAR(100),
@dbObject VARCHAR(100),
@ObjectBody VARCHAR(7000),
@dbName VARCHAR(100)
SET @DisplayText = @Text
SET @text = '%' + @text + '%'
SET @AddedRecord = 0
CREATE TABLE #SearchResults
(
DBName VARCHAR(100) NOT NULL,
ObjectType VARCHAR(100) NOT NULL,
ObjectName VARCHAR(100) NOT NULL,
Line INT NOT NULL,
Reference VARCHAR(7000) NOT NULL
)
CREATE TABLE #tempSysComments
(
DBName VARCHAR(100),
DBObjectType VARCHAR(100),
DBObject VARCHAR(100),
TextString text
)
--Populate a table with the search results from all databases on the server that include the searched text
SET @sSql = 'USE [?]
SELECT
''?'' AS DBName,
LOWER(REPLACE(o.type_desc, ''_'', '' '')) + '' ('' + RTRIM(type) + '')'' AS DBObjectType,
OBJECT_NAME(sm.object_id) AS DBObject,
CAST(sm.definition AS VARCHAR(7000)) AS TextString
FROM sys.sql_modules AS sm
JOIN sys.objects AS o
ON sm.object_id = o.object_id
WHERE CAST(sm.definition AS VARCHAR(7000)) LIKE ''' + @text + '''
ORDER BY o.type_desc, OBJECT_NAME(sm.object_id)'
IF (@searchDB IS NULL)
BEGIN
INSERT INTO #tempSysComments
EXEC sp_MSFOREachDB @sSql
END
ELSE
BEGIN
SET @sSql = REPLACE(@sSql, '?', @searchDB)
INSERT INTO #tempSysComments
EXEC (@sSql)
END
DECLARE codeCursor CURSOR
FOR
SELECT DBName, DBObjectType, DBObject, TextString
FROM #tempSysComments
WHERE DBName IS NOT NULL
OPEN codeCursor
FETCH NEXT FROM codeCursor INTO @dbName, @dbObjectType, @dbObject, @ObjectBody
IF @@FETCH_STATUS <> 0
BEGIN
PRINT 'Text ''' + @DisplayText + ''' was not found in objects on server ' + @@SERVERNAME
-- Close and release code cursor.
CLOSE codeCursor
DEALLOCATE codeCursor
RETURN
END
-- Search each object within code cursor.
WHILE @@FETCH_STATUS = 0
BEGIN
SET @lineNo = 0
SET @counter = 1
-- Process each line.
WHILE (@counter <> Len(@ObjectBody))
BEGIN
SET @char = SUBSTRING(@ObjectBody, @counter,1)
-- Check for line breaks.
IF (@char = CHAR(13))
BEGIN
SET @lineNo = @lineNo + 1
-- Check if we found the specified text.
IF (PATINDEX(@text, @line) <> 0)
BEGIN
SET @AddedRecord = 1
INSERT #SearchResults
SELECT @dbName, @dbObjectType, @dbObject, @lineNo, LEFT(RTRIM(LTRIM(@line)), 7000)
END
SET @line = ''
END
SET @line = @line + @char
SET @counter = @counter + 1
END
IF (@AddedRecord = 0)
INSERT #SearchResults
SELECT @dbName, @dbObjectType, @dbObject, 0, SUBSTRING(@ObjectBody, 1, 7000)
SET @AddedRecord = 0
FETCH NEXT FROM codeCursor INTO @dbName, @dbObjectType, @dbObject, @ObjectBody
END
-- Close and release cursor.
CLOSE codeCursor
DEALLOCATE codeCursor
-- Return the info.
SELECT DISTINCT DBName, ObjectType, ObjectName, Line, RTRIM(LTRIM(REPLACE(REPLACE(Reference, CHAR(9), ' '), CHAR(13)+CHAR(10), ' '))) AS Reference
FROM #SearchResults
ORDER BY DBName, ObjectType, ObjectName, Line
-- Cleanup.
DROP TABLE #SearchResults
DROP TABLE #tempSysComments
RETURN