2014-08-01 3 views
0

Обновление с предложением pmbAustin вSQL Таблица переменных - добавление ограничений, который проверяет наличие соответствующей строки установить

pmbAustin, спасибо. Я думаю, что это сработает. Я создал функцию «dbo.CK_WinteamSportExists», которая возвращает 0 или 1. Однако теперь я получаю сообщение об ошибке. Когда я проверил мое решение, которое я получаю следующее:

create table #check 
(
SportID int 
,WinTeamID int 
,LoseTeamID int 
,check 
(
(dbo.CK_WinteamSportExists (WinTeamID , SportID) = 1) 
) 
) 

Сообщение об ошибке: Msg 4121, уровень 16, состояние 1, строка 1 Не может найти либо столбец «DBO» или определенного пользователь функцию или совокупный «DBO .CK_WinteamSportExists ", или имя неоднозначно.

Я пробовал использовать полное имя «mydatabase.dbo.CK_WinteamSportExists», без кубиков.
Похоже, что у меня есть синтаксис неправильно в проверке, но для жизни меня я не могу найти ошибку.

Оригинал Вопрос
Я пытаюсь обеспечить целостность на табличную переменную. Я работает в SQL Server 2012.

declare @GameID_Table table (
GameID int 
,SportID int 
,WinTeamID int 
,LoseTeamID int 
) 

Комбинации WinTeamID/SportID и LoseTeamID/SportID в @GameID_Table должны быть ограничены наличием совпадающей строки в отдельной таблице Link_TeamSport определяется как:

create table Link_TeamSport 
(
TeamID int, 
SportID int 
primary key (TeamID, SportID) 
) 

Обычно я делаю это с помощью сложного внешнего ключа, однако это не допускается в переменных таблицы.
Я также попытался создать пользовательские функции, которые проверяют наличие соответствующей строки в Link_TeamSport, но UDF также не разрешены в переменных таблицы.

Вот пример рабочего кода, который иллюстрирует мое условие ограничения. Код ниже возвращает результат 1, если найдена совпадающая строка, а 0 - нет. Однако я не могу понять, как включить эту концепцию в контрольное ограничение в @GameID_Table.

declare @winteam int 
declare @sportid int 
set @winteam = 1001 
set @sportid = 4001 

select count(*) from 
(
select lts.TeamID, lts.sportid from Link_TeamSport lts 
where 
(@winteam = lts.TeamID and @sportid = lts.sportid) 
) a 

ответ

0

Вместо этого используйте #TempTable. @TableVariables имеет множество ограничений, которые #TempTables не делают, а также не работают, если у вас будет больше, чем несколько строк в них.