Sql server 如何在MS SQL数据库中搜索特定字符串?
形势 我来自PHP+MySQL的背景,我正在迁移一个ASP网站 我以前迁移过几次,但在本例中,我遇到了一些问题,这些问题使我迷失了方向,并阻止我导入数据库 障碍Sql server 如何在MS SQL数据库中搜索特定字符串?,sql-server,Sql Server,形势 我来自PHP+MySQL的背景,我正在迁移一个ASP网站 我以前迁移过几次,但在本例中,我遇到了一些问题,这些问题使我迷失了方向,并阻止我导入数据库 障碍 我通过Plesk(撰写本文时的当前版本)下载了MS SQL数据库的备份。但打开它时,我发现字符串是数字,而不是SQL。因此,我无法找到并替换网站URL 前 5441 5045 0000 0300 8c00 0e01 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 当我通过my
5441 5045 0000 0300 8c00 0e01 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000
myLittleAdmin
连接到MS SQL并导航到工具>新查询并尝试使用FIND
或SEARCH
命令时,就像在MySQL中一样,它根本不起作用最终,我只是在寻找我编写的MS SQL代码,以便在整个数据库中搜索特定文本字符串的实例。请参阅以下关于获取转储的SO帖子:
从那里,找到有问题的文本,然后在确定必要的表和列后,相应地更新实际的数据库。我请人为我编写脚本 以下是
find
脚本(更新第2行,“文本搜索到搜索”):
下面是查找和替换脚本(更新第13行):
查询系统表以查找所有char、nchar、varchar和nvarchar列。在结果中循环寻找你的字符串。谢谢你的回复,但我在帖子中提到我不知道写什么。我很高兴学习如何编写它,但我需要一些指导,因为官方文档没有返回任何搜索功能的结果。我敢肯定,在浏览文档时,我可能没有正确的术语。SQL Server备份(.bak
)是一个二进制文件,而不是SQL命令。您需要使用SQL ServerRESTORE
命令来恢复它-您不能只是在它的内部窥视一下来澄清-MySql备份是组成数据库的DML和DDL的文本转储@Spencershill Sql Server备份在每个可能的方面都完全不同,正如marc_在上文中所说,它们以不可修改的二进制格式存储,只能在后续还原中使用。啊,好的,因此是数字字符串。谢谢你的澄清!我不知道SQL Server与MySQL有那么大的不同,它是一个令人尊敬的、可读的.SQL文件。谢谢。谢谢Amber,我将尝试一下,并将此标记为答案,假设我成功地遵循了文章中的任何说明。嗨,Amber,由于某些原因,我无法使用Microsoft SQL Server Manager进行远程连接,因此我无法将数据库导出为建议的可读格式。但是,我可以运行查询。我最初的问题实际上是询问搜索整个数据库的查询是什么。你能帮我吗?非常感谢。
USE DATABASE_NAME
DECLARE @SearchStr nvarchar(100) = 'TEXT_TO_SEARCH'
DECLARE @Results TABLE (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 ColumnName, ColumnValue FROM @Results
SET NOCOUNT ON
DECLARE @stringToFind VARCHAR(100)
DECLARE @stringToReplace VARCHAR(100)
DECLARE @schema sysname
DECLARE @table sysname
DECLARE @count INT
DECLARE @sqlCommand VARCHAR(8000)
DECLARE @where VARCHAR(8000)
DECLARE @columnName sysname
DECLARE @object_id INT
SET @stringToFind = 'TEXT_TO _FIND'
SET @stringToReplace = 'TEXT_TO_REPLACE'
DECLARE TAB_CURSOR CURSOR FOR
SELECT B.NAME AS SCHEMANAME,
A.NAME AS TABLENAME,
A.OBJECT_ID
FROM sys.objects A
INNER JOIN sys.schemas B
ON A.SCHEMA_ID = B.SCHEMA_ID
WHERE TYPE = 'U'
ORDER BY 1
OPEN TAB_CURSOR
FETCH NEXT FROM TAB_CURSOR
INTO @schema,
@table,
@object_id
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE COL_CURSOR CURSOR FOR
SELECT A.NAME
FROM sys.columns A
INNER JOIN sys.types B
ON A.SYSTEM_TYPE_ID = B.SYSTEM_TYPE_ID
WHERE OBJECT_ID = @object_id
AND IS_COMPUTED = 0
AND B.NAME IN ('char','nchar','nvarchar','varchar','text','ntext')
OPEN COL_CURSOR
FETCH NEXT FROM COL_CURSOR
INTO @columnName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sqlCommand = 'UPDATE ' + @schema + '.' + @table + ' SET [' + @columnName
+ '] = REPLACE(convert(nvarchar(max),[' + @columnName + ']),'''
+ @stringToFind + ''',''' + @stringToReplace + ''')'
SET @where = ' WHERE [' + @columnName + '] LIKE ''%' + @stringToFind + '%'''
EXEC( @sqlCommand + @where)
SET @count = @@ROWCOUNT
IF @count > 0
BEGIN
PRINT @sqlCommand + @where
PRINT 'Updated: ' + CONVERT(VARCHAR(10),@count)
PRINT '----------------------------------------------------'
END
FETCH NEXT FROM COL_CURSOR
INTO @columnName
END
CLOSE COL_CURSOR
DEALLOCATE COL_CURSOR
FETCH NEXT FROM TAB_CURSOR
INTO @schema,
@table,
@object_id
END
CLOSE TAB_CURSOR
DEALLOCATE TAB_CURSOR