วัน: 16 มีนาคม 2019

SQL Server: find tableSQL Server: find table

เพราะว่าตารางในระบบที่กำลังทำมันซับซ้อน มีทั้ง database, schemas, table อยู่หลายก้อน และมีการ join กันข้ามdatabase เป็นเรื่องปกติทำให้การอ้างถึงตารางต้องมีการหาว่า table นี้อยู่ที่ไหนบ่อย ๆ
find_from_table_name.sql

-- Declare variables
DECLARE @SEARCH NVARCHAR (255) = 'Pitt';-- Search from
DECLARE @SQL NVARCHAR (MAX) = ''; -- Build the dynamic SQL query by iterating through online databases
SELECT @SQL += ' SELECT DB_NAME () AS DatabaseName, s.name COLLATE DATABASE_DEFAULT AS SchemaName, t.name COLLATE DATABASE_DEFAULT AS TableName, (DB_NAME () COLLATE DATABASE_DEFAULT + ''.'' + s.name COLLATE DATABASE_DEFAULT + ''.'' + t.name COLLATE DATABASE_DEFAULT) AS FullyQualifiedDomainName FROM ' + QUOTENAME (d.name) + '.sys.tables AS t INNER JOIN ' + QUOTENAME (d.name) + '.sys.schemas AS s ON t.schema_id = s.schema_id WHERE t.name LIKE ''%' + REPLACE (@SEARCH, '''', '''''') + '%'' UNION ALL '
FROM sys.databases AS d
WHERE state = 0; -- Only online databases -- Remove the trailing UNION ALL
IF LEN (@SQL) > 0 SET @SQL = LEFT (@SQL, LEN (@SQL) - LEN (' UNION ALL ')) ; -- Execute the dynamic SQL if it's not empty, otherwise return a message
IF @SQL <> ''
BEGIN PRINT @SQL; -- Debug: View the generated SQL EXEC sp_executesql @SQL;
END
ELSE
BEGIN SELECT 'No tables found with ''' + @SEARCH + ''' in their names.' AS Result;
END

ผลลัพท์ที่ได้จะได้ DatabaseName, SchemaName, TableName กลับมา โดยใช้ในรูปแบบ Fully qualified domain name (FQDN)
SELECT * FROM {DatabaseName}.{SchemaName}.{TableName};
เช่น
SELECT * FROM db_43sqhf23r_43swc7537.dbo.Pitt_phunsanit;

ข้อสังเกต DB_NAME () เป็น function ที่จะ return ชื่อของฐานข้อมูลปัจจุบัน (หรือฐานข้อมูลที่ระบุ ถ้ามีการส่งพารามิเตอร์) กลับมา ไม่ใช่ส่วนหนึ่งของ sys.databases AS d

อ่านเพิ่มเติม