Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana menemukan string di dalam seluruh database?

Ini akan berhasil:

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;

Beberapa peringatan, meskipun. Pertama, ini sangat lambat dan tidak dioptimalkan . Semua nilai sedang dikonversi ke nvarchar sederhana sehingga mereka dapat dibandingkan tanpa kesalahan. Anda mungkin mengalami masalah dengan nilai seperti datetime tidak mengonversi seperti yang diharapkan dan oleh karena itu tidak dicocokkan saat seharusnya (negatif palsu).

WHERE (0 = 1) apakah ada untuk membuat bangunan OR klausa lebih mudah. Jika tidak ada yang cocok, Anda tidak akan mendapatkan baris kembali.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mendapatkan daftar tabel di database, menggunakan MS SQL 2008?

  2. Bagaimana cara memasukkan daftar dari C sharp ke SQL Server 2008?

  3. alternatif untuk REPLACE pada tipe data teks atau nteks

  4. Hubungkan ke SQL Server melalui alamat IP

  5. T-SQL:CTE dengan kolom identitas