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.