Hiermee krijgt u de lijst die u zoekt, maar het zal u niet helpen als u dergelijke kolomverwijzingen hebt ingebed in dynamische SQL (en mogelijk geen verwijzingen vindt die afhankelijk zijn van uitgestelde naamomzetting). SQL Server ontleedt de tekst van de opgeslagen procedure niet om met de DMV-uitvoer te komen.
Probeer het nu met COLLATE
clausules voor gevallen waarin u databases op dezelfde server met verschillende sorteringen hebt.
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'UNION ALL
SELECT
[database] = ''' + REPLACE(name, '''', '''''') + ''',
[procedure] = QUOTENAME(s.name) + ''.'' + QUOTENAME(p.name)
COLLATE Latin1_General_CI_AI,
[table] = QUOTENAME(referenced_schema_name) + ''.''
+ QUOTENAME(referenced_entity_name)
COLLATE Latin1_General_CI_AI,
[column] = QUOTENAME(referenced_minor_name)
COLLATE Latin1_General_CI_AI
FROM ' + QUOTENAME(name) + '.sys.schemas AS s
INNER JOIN ' + QUOTENAME(name) + '.sys.procedures AS p
ON s.[schema_id] = p.[schema_id]
CROSS APPLY ' + QUOTENAME(name)
+ '.sys.dm_sql_referenced_entities'
+ '(QUOTENAME(s.name) + ''.'' + QUOTENAME(p.name), N''OBJECT'') AS d
WHERE d.referenced_minor_id > 0'
FROM sys.databases
WHERE database_id > 4
AND [state] = 0;
SET @sql = STUFF(@sql,1,11,'');
EXEC sp_executesql @sql;
Ook de CROSS APPLY
syntaxis werkt niet als u databases hebt die zich in de 80-compatibiliteitsmodus bevinden. Zorg er wel voor dat u de code niet in zo'n database uitvoert en dat het goed zou moeten werken (zelfs als sommige van de doeldatabases in 80 staan).