sybase - 在整个 Sybase 数据库中搜索一串数据

标签 sybase sqlanywhere

我有一个 Sybase 数据库和 SQL Anywhere 16 用于查询数据。我需要在数据库中找到一些示例数据。有数百个表的名称毫无用处。

虽然我了解 SQL 语言(我是 SQL Server 开发人员),但我不是 Sybase 专家。

是否有一个脚本可以循环遍历所有表的所有列来查找此示例数据?

谢谢

康拉德

最佳答案

您可以尝试以下操作:

CREATE TABLE "DBA"."table_track" (
"Table_name" VARCHAR(200) NULL,
"Column_name" VARCHAR(200) NULL,
"ls_search" VARCHAR(2000) NULL
) IN "system";

CREATE OR REPLACE PROCEDURE "DBA"."sp_get_data"(as_search   varchar(2000))
BEGIN
    DECLARE cur_test NO SCROLL cursor for select table_Name, column_name from Table_List ;

    DECLARE ls_sql varchar(20000);
    DECLARE ls_table_name varchar(80);
    DECLARE ls_column_name varchar(80);
    DECLARE ld_count Numeric(10,0);  
    DECLARE le_total_column_count   INTEGER;
    DECLARE le_counter  INTEGER;

    If Exists (SELECT 1 FROM sysobjects WHERE name ='Table_List' AND Type='U') Then
        Drop Table Table_List;
     End IF;

    SELECT
        sys.SYSTABLE.table_name,
        sys.SYSTABCOL.column_name   
    Into Table_List
    FROM
        sys.SYSTABLE
    Inner Join
         sys.SYSTABCOL on sys.SYSTABLE.table_id = sys.SYSTABCOL.table_id
    Where
        sys.SYSTABLE.table_type = 'BASE'
        AND sys.SYSTABLE.creator = 1
        and count > 0
        and width >= 4
        AND sys.systable.table_name not in ('table_track')
        AND (sys.SYSTABCOL.base_type_str like '%char%' OR sys.SYSTABCOL.base_type_str like '%xml%');

    select count() into le_total_column_count from table_list;

    Message as_search to client;

    set le_counter = 0;

    Open cur_test;
    lp: loop
     Fetch Next cur_test into ls_table_name, ls_column_name; 
        If SQLCODE <> 0 Then
            LEAVE lp
        End If;

        SET le_counter = le_counter + 1;

        message 'Search column ' + string(le_counter) + ' of ' + string(le_total_column_count) TO CLIENT;

        Set ls_sql = 'select count(*) into ld_count from "' + ls_table_name + '" where "' + ls_column_name + '" like ''%'+ as_search + '%''';      
        EXECUTE (ls_sql);
        If SQLCODE <> 0 Then
            return -1;
        End If;

        If ld_count <> '' and ld_count is not null  Then
            If ISNULL(ld_count,0) > 0 Then
                Insert into table_track (table_name,column_name,ls_search) values (ls_table_name,ls_column_name,as_search);
            END If;
        END If ;

    End Loop;
    Close cur_test;
    Deallocate cur_test;
    commit;
    // Select * from table_track;
END; 

call sp_get_data('test');

select * from table_track;

我想你可以从中得到一个想法,然后你可以根据你的要求进行更改。

关于sybase - 在整个 Sybase 数据库中搜索一串数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50628931/

相关文章:

database - 如何使用日期/时间戳备份 sybase 数据库

editor - Sybase Sql Advantage 是否有替代方案?

sql - 如何在 Sybase Anywhere 11 中更改数据库用户名和数据库组名

sql - 如何在sql中搜索小时/分钟?

sybase - Sybase SQL Anywhere -O(大写)开关的作用是什么?

.net - 是否可以将 .NET 应用程序直接连接到 Sybase SQL Anywhere 数据库文件

database - 区分大小写的 sybase 查询 : Invalid column name

sql - Sybase 日期比较 - 格式正确吗?

database - 为什么 SAP IQ 加载表选项比 Interactive SQL 中的导入向导更快?

sql - 来自 Sybase 的神秘 SQL 错误(错误 -680)