Điều này sẽ hoạt động:
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;
Tuy nhiên, một vài lưu ý. Đầu tiên, điều này quá chậm và không được tối ưu hóa . Tất cả các giá trị đang được chuyển đổi thành nvarchar
đơn giản để chúng có thể được so sánh mà không có sai sót. Bạn có thể gặp sự cố với các giá trị như datetime
không chuyển đổi như mong đợi và do đó không được đối sánh khi chúng phải như vậy (phủ định sai).
WHERE (0 = 1)
ở đó để tạo OR
mệnh đề dễ dàng hơn. Nếu không có kết quả phù hợp, bạn sẽ không lấy lại được bất kỳ hàng nào.