यह काम करेगा:
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
का निर्माण करना है? खंड आसान। यदि मैच नहीं हैं तो आपको कोई पंक्ति वापस नहीं मिलेगी।