Добрый день!
Иногда необходимо знать с какими таблицами связана та или иная таблица и сколько связанных записей в них присутствует.
Для получения информации о связях записи с таблицами выполните на SQL сервере приведенный ниже скрипт. Выделенный текст можно изменять в зависимости от того какая запись и из какой таблицы Вас интересует.
declare @PrimaryTableName sysname
declare @RecordID uniqueidentifier
declare @SQL nvarchar(2000)
declare @TableName sysname
declare @Caption nvarchar(250)
declare @DeleteRule int
declare @FKColumnName sysname
--здесь укажите название таблицы
SET @PrimaryTableName = 'tbl_Account'
--здесь укажите интересующую Вас запись, либо удалите строку, если просто
--хотите увидеть связи искомой таблицы
SET @RecordID = '{D083AE11-ED14-4363-A20D-32967B3777C8}'
CREATE TABLE #FKEYSNAMES(
PKTABLE_QUALIFIER sysname collate database_default NULL,
PKTABLE_OWNER sysname collate database_default NULL,
PKTABLE_NAME sysname collate database_default NOT NULL,
PKCOLUMN_NAME sysname collate database_default NOT NULL,
FKTABLE_QUALIFIER sysname collate database_default NULL,
FKTABLE_OWNER sysname collate database_default NULL,
FKTABLE_NAME sysname collate database_default NOT NULL,
FKCOLUMN_NAME sysname collate database_default NOT NULL,
KEY_SEQ smallint NOT NULL,
UPDATE_RULE smallint NULL,
DELETE_RULE smallint NULL,
FK_NAME sysname collate database_default NULL,
PK_NAME sysname collate database_default NULL,
DEFERRABILITY smallint NULL)
INSERT INTO #FKEYSNAMES
EXEC [sp_fkeys] @pktable_name = @PrimaryTableName
declare c_Temp cursor FOR
SELECT DISTINCT [s].[Caption], [k].[FKTABLE_NAME], [k].[DELETE_RULE], [k].[FKCOLUMN_NAME]
FROM #FKEYSNAMES [k]
LEFT OUTER JOIN [tbl_Service] s
ON [k].[FKTABLE_NAME] = [s].[Code]
open c_Temp
while 1 = 1
begin
fetch next FROM c_Temp INTO @Caption, @TableName, @DeleteRule, @FKColumnName
IF @@fetch_status = -1 break
IF @@fetch_status = -2 continue
SET @SQL = 'declare @P1 nvarchar(50) set @P1 = (select count(*) from ' + @TableName + ' where ' + @FKColumnName + ' = ''' + cast(@RecordID AS nvarchar(38)) + ''') select @P1 + '' records in '''
exec sp_executesql @SQL
SELECT @TableName
end
close c_Temp
deallocate c_Temp
DROP TABLE #FKEYSNAMES
declare @RecordID uniqueidentifier
declare @SQL nvarchar(2000)
declare @TableName sysname
declare @Caption nvarchar(250)
declare @DeleteRule int
declare @FKColumnName sysname
--здесь укажите название таблицы
SET @PrimaryTableName = 'tbl_Account'
--здесь укажите интересующую Вас запись, либо удалите строку, если просто
--хотите увидеть связи искомой таблицы
SET @RecordID = '{D083AE11-ED14-4363-A20D-32967B3777C8}'
CREATE TABLE #FKEYSNAMES(
PKTABLE_QUALIFIER sysname collate database_default NULL,
PKTABLE_OWNER sysname collate database_default NULL,
PKTABLE_NAME sysname collate database_default NOT NULL,
PKCOLUMN_NAME sysname collate database_default NOT NULL,
FKTABLE_QUALIFIER sysname collate database_default NULL,
FKTABLE_OWNER sysname collate database_default NULL,
FKTABLE_NAME sysname collate database_default NOT NULL,
FKCOLUMN_NAME sysname collate database_default NOT NULL,
KEY_SEQ smallint NOT NULL,
UPDATE_RULE smallint NULL,
DELETE_RULE smallint NULL,
FK_NAME sysname collate database_default NULL,
PK_NAME sysname collate database_default NULL,
DEFERRABILITY smallint NULL)
INSERT INTO #FKEYSNAMES
EXEC [sp_fkeys] @pktable_name = @PrimaryTableName
declare c_Temp cursor FOR
SELECT DISTINCT [s].[Caption], [k].[FKTABLE_NAME], [k].[DELETE_RULE], [k].[FKCOLUMN_NAME]
FROM #FKEYSNAMES [k]
LEFT OUTER JOIN [tbl_Service] s
ON [k].[FKTABLE_NAME] = [s].[Code]
open c_Temp
while 1 = 1
begin
fetch next FROM c_Temp INTO @Caption, @TableName, @DeleteRule, @FKColumnName
IF @@fetch_status = -1 break
IF @@fetch_status = -2 continue
SET @SQL = 'declare @P1 nvarchar(50) set @P1 = (select count(*) from ' + @TableName + ' where ' + @FKColumnName + ' = ''' + cast(@RecordID AS nvarchar(38)) + ''') select @P1 + '' records in '''
exec sp_executesql @SQL
SELECT @TableName
end
close c_Temp
deallocate c_Temp
DROP TABLE #FKEYSNAMES
Как результат:
4 мая 2012 19:27
Дмитрий, я бы указал, что для поиска связи для таблицы, которая администрируется по записям (например, Контрагенты (tbl_Account)), необходимо обладать правами администратора (sysadmin на сервере или db_owner в конкретной БД), так как у обычного пользователя доступ только на представление vw_Account, а по представлению такую информацию не просто получить.
Показать все комментарии
Войдите или зарегистрируйтесь, что бы комментировать