Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在MS SQL数据库中搜索特定字符串?_Sql Server - Fatal编程技术网

Sql server 如何在MS SQL数据库中搜索特定字符串?

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

形势

我来自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

  • 当我通过
    myLittleAdmin
    连接到MS SQL并导航到工具>新查询并尝试使用
    FIND
    SEARCH
    命令时,就像在MySQL中一样,它根本不起作用
  • 我在MS SQL文档中搜索类似的命令,但找不到任何命令。这里所有关于堆栈溢出的问题,都与我的问题有关,都有大量的查询,这些查询有很多语法/代码,与我的问题的简单性无关

    问题

    有人能帮我理解我在这里遗漏了什么吗


    最终,我只是在寻找我编写的MS SQL代码,以便在整个数据库中搜索特定文本字符串的实例。请参阅以下关于获取转储的SO帖子:


    从那里,找到有问题的文本,然后在确定必要的表和列后,相应地更新实际的数据库。

    我请人为我编写脚本

    以下是
    find
    脚本(更新第2行,“文本搜索到搜索”):

    下面是
    查找和替换
    脚本(更新第13行):


    查询系统表以查找所有char、nchar、varchar和nvarchar列。在结果中循环寻找你的字符串。谢谢你的回复,但我在帖子中提到我不知道写什么。我很高兴学习如何编写它,但我需要一些指导,因为官方文档没有返回任何搜索功能的结果。我敢肯定,在浏览文档时,我可能没有正确的术语。SQL Server备份(
    .bak
    )是一个二进制文件,而不是SQL命令。您需要使用SQL Server
    RESTORE
    命令来恢复它-您不能只是在它的内部窥视一下来澄清-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