sql >> データベース >  >> RDS >> Sqlserver

データベース全体の中で文字列を見つける方法は?

    これは機能します:

    DECLARE @MyValue NVarChar(4000) = 'something';
    
    SELECT S.name SchemaName, T.name TableName
    INTO #T
    FROM sys.schemas S INNER JOIN
         sys.tables T ON S.schema_id = T.schema_id;
    
    WHILE (EXISTS (SELECT * FROM #T)) BEGIN
      DECLARE @SQL NVarChar(4000) = 'SELECT * FROM $$TableName WHERE (0 = 1) ';
      DECLARE @TableName NVarChar(1000) = (
        SELECT TOP 1 SchemaName + '.' + TableName FROM #T
      );
      SELECT @SQL = REPLACE(@SQL, '$$TableName', @TableName);
    
      DECLARE @Cols NVarChar(4000) = '';
    
      SELECT
        @Cols = COALESCE(@Cols + 'OR CONVERT(NVarChar(4000), ', '') + C.name + ') = CONVERT(NVarChar(4000), ''$$MyValue'') '
      FROM sys.columns C
      WHERE C.object_id = OBJECT_ID(@TableName);
    
      SELECT @Cols = REPLACE(@Cols, '$$MyValue', @MyValue);
      SELECT @SQL = @SQL + @Cols;
    
      EXECUTE(@SQL);
    
      DELETE FROM #T
      WHERE SchemaName + '.' + TableName = @TableName;
    END;
    
    DROP TABLE #T;
    

    ただし、いくつかの注意点があります。まず、これは非常に遅く、最適化されていません 。すべての値はnvarcharに変換されています エラーなしで比較できるようにするためです。 datetimeなどの値で問題が発生する可能性があります 期待どおりに変換されないため、必要なときに一致しません(フォールスネガティブ)。

    WHERE (0 = 1) ORの構築を行うためにあります 節が簡単になります。一致するものがない場合、行は返されません。



    1. 重複した行を削除してテーブルを更新する方法

    2. Entity Frameworkを介してOracleデータベースのIDを自動的に生成するにはどうすればよいですか?

    3. QlikSenseでのJavaデータの操作

    4. 3つのマスターノードをMySQLに接続するためのConnectionString