Sqlserver
 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक कॉलम पर MAX () मान के साथ एक पंक्ति चुनें

  2. ऑर्डर की तारीख और उत्पादों से अलग SQL Server 2008

  3. SQL सर्वर को समझना हमेशा एन्क्रिप्टेड

  4. ADO.net SqlTransaction प्रदर्शन में सुधार करता है

  5. तालिका प्रकार चर में कंपाउंड प्राथमिक कुंजी