Das wird funktionieren:
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;
Ein paar Vorbehalte, aber. Erstens, das ist unverschämt langsam und nicht optimiert . Alle Werte werden in nvarchar
umgewandelt einfach, damit sie fehlerfrei verglichen werden können. Es können Probleme mit Werten wie datetime
auftreten konvertieren nicht wie erwartet und werden daher nicht zugeordnet, wenn sie es sein sollten (falsche Negative).
Der WHERE (0 = 1)
ist da, um den Aufbau des OR
zu machen Klausel einfacher. Wenn es keine Übereinstimmungen gibt, erhalten Sie keine Zeilen zurück.