MS SQL вопрос FK via PK
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- Lepsik
- Житель
- Сообщения: 522
- Зарегистрирован: 17 фев 2003, 18:34
- Откуда: Berlin
- Контактная информация:
MS SQL вопрос FK via PK
не могу найти список соответствия полей
могу найти master tables
select b1.name, b2.name
from (select sysreferences.constid as id1, sysreferences.fkeyid as id2
from sysobjects left join sysreferences on sysobjects.id=sysreferences.rkeyid where sysobjects.name='slave table') as val, sysobjects as b1, sysobjects as b2 WHERE val.id1 = b1.id and val.id2 = b2.id
могу найти список FK по констрейну
SELECT DISTINCT COLUMN_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE TABLE_NAME='slave_table' AND C
и могу найти PK по имени master table
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu, INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc WHERE C and cu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME AND cu.TABLE_NAME='master_table_1' ORDER BY ORDINAL_POSITION
а вот как понять какое поле в FK какому соответствует в PK ?
могу найти master tables
select b1.name, b2.name
from (select sysreferences.constid as id1, sysreferences.fkeyid as id2
from sysobjects left join sysreferences on sysobjects.id=sysreferences.rkeyid where sysobjects.name='slave table') as val, sysobjects as b1, sysobjects as b2 WHERE val.id1 = b1.id and val.id2 = b2.id
могу найти список FK по констрейну
SELECT DISTINCT COLUMN_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE TABLE_NAME='slave_table' AND C
и могу найти PK по имени master table
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu, INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc WHERE C and cu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME AND cu.TABLE_NAME='master_table_1' ORDER BY ORDINAL_POSITION
а вот как понять какое поле в FK какому соответствует в PK ?
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
- Lepsik
- Житель
- Сообщения: 522
- Зарегистрирован: 17 фев 2003, 18:34
- Откуда: Berlin
- Контактная информация:
проблема в том что я должен знать зависимость.
у меня slave table имеет 3 мастера
более того ключи пересекаются.
есть такой вариант
select a.constraint_name, a.table_name as FK_Table, a.column_name AS FK_column,c.table_name AS PK_Table, c.column_name AS PK_column
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE a
inner join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS b on b.constraint_name = a.constraint_name
inner join INFORMATION_SCHEMA.KEY_COLUMN_USAGE c on c.constraint_name = b.unique_constraint_name
но он дает пересечение, то нужный порядок как в :
sp_helpconstraint your_table_name
получить не удается.
я знаю имя констрейна, имя мастер таблицы, точно порядок полей в PK мастер таблицы - мне надо к этому порядку привязать порядок полей в FK
у меня slave table имеет 3 мастера
более того ключи пересекаются.
есть такой вариант
select a.constraint_name, a.table_name as FK_Table, a.column_name AS FK_column,c.table_name AS PK_Table, c.column_name AS PK_column
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE a
inner join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS b on b.constraint_name = a.constraint_name
inner join INFORMATION_SCHEMA.KEY_COLUMN_USAGE c on c.constraint_name = b.unique_constraint_name
но он дает пересечение, то нужный порядок как в :
sp_helpconstraint your_table_name
получить не удается.
я знаю имя констрейна, имя мастер таблицы, точно порядок полей в PK мастер таблицы - мне надо к этому порядку привязать порядок полей в FK
- Lepsik
- Житель
- Сообщения: 522
- Зарегистрирован: 17 фев 2003, 18:34
- Откуда: Berlin
- Контактная информация:
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
- Lepsik
- Житель
- Сообщения: 522
- Зарегистрирован: 17 фев 2003, 18:34
- Откуда: Berlin
- Контактная информация:
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
не не знаю.
да и зачем? я подобные вещи всегда сам делал. Не знаешь как квери написать, посмотри исходник sp_helpconstraint. Сделать это _очень_ просто.
удачи!
![Smile :)](./images/smilies/smile.gif)
Код: Выделить всё
select
sc.text
from
master..sysobjects so,
master..syscomments sc
where
so.name = 'sp_helpconstraint' and
so.type = 'P' and
sc.id = so.id
order by
sc.colid
- Lepsik
- Житель
- Сообщения: 522
- Зарегистрирован: 17 фев 2003, 18:34
- Откуда: Berlin
- Контактная информация:
а почему выдает какой-то покоцанный текст ?
часть переменных не определена (fkeycol, @rkeycol) ?![Sad :(](./images/smilies/sad.gif)
/*-----------------------------
select
sc.text
from
-----------------------------*/
text
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
create proc sp_helpconstraint
@objname nvarchar(776) -- the table to check for constraints
,@nomsg varchar(5) = 'msg' -- 'nomsg' supresses printing of TBName (sp_help)
as
-- PRELIMfkeycol, @rkeycol
set nocount on
declare @objid int -- the
select @keys = col_name(@fkeyid, @fkeycol), @cnstdes = col_name(@rkeyid, @rkeycol)
fetch ms_crs_fkey into @fkeycol, @rkeycol
while @@fetch_status >= 0
begin
select @keys = @keys + ', ' + col_name(@fkeyid, @fkeycol),
here c.id = @objid and m.id = c.domain and ObjectProperty(c.domain, 'IsRule') = 1
insert into #spcnsttab (cnst_id,cnst_type,cnst_name,cnst_nonblank_name,cnst_keys, cnst_2type)
select c.cdefault, 'DEFAULT on column ' + c.name + ' (bound with sp_bindef
(3 row(s) affected)
часть переменных не определена (fkeycol, @rkeycol) ?
![Sad :(](./images/smilies/sad.gif)
/*-----------------------------
select
sc.text
from
-----------------------------*/
text
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
create proc sp_helpconstraint
@objname nvarchar(776) -- the table to check for constraints
,@nomsg varchar(5) = 'msg' -- 'nomsg' supresses printing of TBName (sp_help)
as
-- PRELIMfkeycol, @rkeycol
set nocount on
declare @objid int -- the
select @keys = col_name(@fkeyid, @fkeycol), @cnstdes = col_name(@rkeyid, @rkeycol)
fetch ms_crs_fkey into @fkeycol, @rkeycol
while @@fetch_status >= 0
begin
select @keys = @keys + ', ' + col_name(@fkeyid, @fkeycol),
here c.id = @objid and m.id = c.domain and ObjectProperty(c.domain, 'IsRule') = 1
insert into #spcnsttab (cnst_id,cnst_type,cnst_name,cnst_nonblank_name,cnst_keys, cnst_2type)
select c.cdefault, 'DEFAULT on column ' + c.name + ' (bound with sp_bindef
(3 row(s) affected)
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
- Lepsik
- Житель
- Сообщения: 522
- Зарегистрирован: 17 фев 2003, 18:34
- Откуда: Berlin
- Контактная информация:
спасибо. но вот наковырял по твоей наводке
select name from syscolumns left join sysforeignkeys on syscolumns.colid=sysforeignkeys.fkey where id=340196262 and sysforeignkeys.constid=868198143
select name from syscolumns left join sysforeignkeys on syscolumns.colid=sysforeignkeys.rkey where id=388196433 and sysforeignkeys.constid=868198143
как бы
a
b
c
d
e
g
перевернуть в
a, d
b, e
c, g
что-то ничего придумать не могу
тогда бы человечество стало бы счастливие на одну задачу
select name from syscolumns left join sysforeignkeys on syscolumns.colid=sysforeignkeys.fkey where id=340196262 and sysforeignkeys.constid=868198143
select name from syscolumns left join sysforeignkeys on syscolumns.colid=sysforeignkeys.rkey where id=388196433 and sysforeignkeys.constid=868198143
как бы
a
b
c
d
e
g
перевернуть в
a, d
b, e
c, g
что-то ничего придумать не могу
тогда бы человечество стало бы счастливие на одну задачу
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
Лепс, ну прочитай хоть одну книжку про сиквел.
этож опупеть... видит пересечение двух селектов и заджойнить не может
признайся ты специально на это народ разводишь или действительно не знаешь БД? если не знаешь, то че ты ими занимаешься? ![Smile :)](./images/smilies/smile.gif)
![Smile :)](./images/smilies/smile.gif)
![Smile :)](./images/smilies/smile.gif)
![Smile :)](./images/smilies/smile.gif)
Код: Выделить всё
select
rkeys.name as ref_col,
fkeys.name as frn_col
from
sysforeignkeys sf,
syscolumns rkeys,
syscolumns fkeys
where
sf.constid = 868198143 and
rkeys.id = sf.rkeyid and
rkeys.colid = sf.rkey and
fkeys.id = sf.fkeyid and
fkeys.colid = sf.fkey
order by
sf.keyno
- Lepsik
- Житель
- Сообщения: 522
- Зарегистрирован: 17 фев 2003, 18:34
- Откуда: Berlin
- Контактная информация:
спасибо.
>Лепс, ну прочитай хоть одну книжку про сиквел. этож опупеть... видит пересечение двух селектов и заджойнить не может признайся ты специально на это народ разводишь или действительно не знаешь БД? если не знаешь, то че ты ими занимаешься?
да уже вагон прочитал. еслибы я только одними базами занимался![Sad :(](./images/smilies/sad.gif)
базы - так семечки, раз месяц припекет. а уже все забыть успел
>Лепс, ну прочитай хоть одну книжку про сиквел. этож опупеть... видит пересечение двух селектов и заджойнить не может признайся ты специально на это народ разводишь или действительно не знаешь БД? если не знаешь, то че ты ими занимаешься?
да уже вагон прочитал. еслибы я только одними базами занимался
![Sad :(](./images/smilies/sad.gif)
базы - так семечки, раз месяц припекет. а уже все забыть успел