如休为视图的计算列加上NOT NULL约束?

lyserver 2013-12-10 06:08:15
比如下面的视图创建语句:

ALTER VIEW [dbo].[vwClient_CompanyPerson]
WITH SCHEMABINDING
AS
SELECT
A.CompanyID*1000+B.PersonID AS CompanyPersonID, A.CompanyID, B.PersonID
FROM
dbo.tblCompany AS A INNER JOIN
dbo.tblPerson AS B ON B.CompanyID=A.CompanyID

如何为CompanyPersonID加上NOT NULL约束?谢谢!!!
...全文
204 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyserver 2013-12-11
  • 打赏
  • 举报
回复
谢谢大家,看来我只能换种思路了。
LongRui888 2013-12-10
  • 打赏
  • 举报
回复
引用 11 楼 lyserver 的回复:
[quote=引用 9 楼 yupeigu 的回复:] [quote=引用 7 楼 yupeigu 的回复:] [quote=引用 6 楼 lyserver 的回复:] [quote=引用 4 楼 yupeigu 的回复:] [quote=引用 2 楼 lyserver 的回复:] 不好意思,标题写错了,如何写成如休了。
你要给CompanyPersonID 这个加上not null的约束,好像不行,我觉得还不如把语句改成这样: ALTER VIEW [dbo].[vwClient_CompanyPerson] WITH SCHEMABINDING AS SELECT isnull(A.CompanyID*1000,0)+isnull(B.PersonID,0) AS CompanyPersonID, A.CompanyID, B.PersonID FROM dbo.tblCompany AS A INNER JOIN dbo.tblPerson AS B ON B.CompanyID=A.CompanyID [/quote] 谢谢。本来CompanyID和PersonID是NOT NULL的,用A.CompanyID*1000+B.PersonID语句后变成了NULL的了,没能继承它们本身的NOT NULL约束。[/quote] 啊,奇怪了,照理,不应该呀,你的试图肯定是没问题的,你的建索引的语句,能给出来不[/quote] 这个是我写的一个例子:
--drop table t1,t2

--1.建表
create table t1(id int)

create table t2(id int)
go


--2.建索引试图
create VIEW [dbo].[vwClient_CompanyPerson]
WITH SCHEMABINDING
AS
SELECT
	A.ID*1000+B.ID AS CompanyPersonID, A.ID, B.ID as idd
FROM
	dbo.t1 AS A INNER JOIN
	dbo.t2 AS B ON B.id=A.ID
go

--drop index idx_t123 on [vwClient_CompanyPerson]


--3.给试图建个索引,没有报错
create  unique clustered index idx_t123 on [vwClient_CompanyPerson]
(CompanyPersonID)
/*
命令已成功完成。
*/
[/quote] 创建主键没有问题,关键是创建全文索引时除问题,全文索引要求主键不能为NULL约束。[/quote] 哦,我看了一下,这个问题好像,解决不了,因为这个索引试图,只是要unique索引,而unique是可能为null值的。 而全文索引要主键索引,这个是不能有null的。
lyserver 2013-12-10
  • 打赏
  • 举报
回复
引用 9 楼 yupeigu 的回复:
[quote=引用 7 楼 yupeigu 的回复:] [quote=引用 6 楼 lyserver 的回复:] [quote=引用 4 楼 yupeigu 的回复:] [quote=引用 2 楼 lyserver 的回复:] 不好意思,标题写错了,如何写成如休了。
你要给CompanyPersonID 这个加上not null的约束,好像不行,我觉得还不如把语句改成这样: ALTER VIEW [dbo].[vwClient_CompanyPerson] WITH SCHEMABINDING AS SELECT isnull(A.CompanyID*1000,0)+isnull(B.PersonID,0) AS CompanyPersonID, A.CompanyID, B.PersonID FROM dbo.tblCompany AS A INNER JOIN dbo.tblPerson AS B ON B.CompanyID=A.CompanyID [/quote] 谢谢。本来CompanyID和PersonID是NOT NULL的,用A.CompanyID*1000+B.PersonID语句后变成了NULL的了,没能继承它们本身的NOT NULL约束。[/quote] 啊,奇怪了,照理,不应该呀,你的试图肯定是没问题的,你的建索引的语句,能给出来不[/quote] 这个是我写的一个例子:
--drop table t1,t2

--1.建表
create table t1(id int)

create table t2(id int)
go


--2.建索引试图
create VIEW [dbo].[vwClient_CompanyPerson]
WITH SCHEMABINDING
AS
SELECT
	A.ID*1000+B.ID AS CompanyPersonID, A.ID, B.ID as idd
FROM
	dbo.t1 AS A INNER JOIN
	dbo.t2 AS B ON B.id=A.ID
go

--drop index idx_t123 on [vwClient_CompanyPerson]


--3.给试图建个索引,没有报错
create  unique clustered index idx_t123 on [vwClient_CompanyPerson]
(CompanyPersonID)
/*
命令已成功完成。
*/
[/quote] 创建主键没有问题,关键是创建全文索引时除问题,全文索引要求主键不能为NULL约束。
lyserver 2013-12-10
  • 打赏
  • 举报
回复
引用 7 楼 yupeigu 的回复:
[quote=引用 6 楼 lyserver 的回复:] [quote=引用 4 楼 yupeigu 的回复:] [quote=引用 2 楼 lyserver 的回复:] 不好意思,标题写错了,如何写成如休了。
你要给CompanyPersonID 这个加上not null的约束,好像不行,我觉得还不如把语句改成这样: ALTER VIEW [dbo].[vwClient_CompanyPerson] WITH SCHEMABINDING AS SELECT isnull(A.CompanyID*1000,0)+isnull(B.PersonID,0) AS CompanyPersonID, A.CompanyID, B.PersonID FROM dbo.tblCompany AS A INNER JOIN dbo.tblPerson AS B ON B.CompanyID=A.CompanyID [/quote] 谢谢。本来CompanyID和PersonID是NOT NULL的,用A.CompanyID*1000+B.PersonID语句后变成了NULL的了,没能继承它们本身的NOT NULL约束。[/quote] 啊,奇怪了,照理,不应该呀,你的试图肯定是没问题的,你的建索引的语句,能给出来不[/quote] 下面是较完整的SQL语句(减了一些字段):
CREATE VIEW [dbo].vwClient_CompanyPerson
WITH SCHEMABINDING
AS
SELECT
	ISNULL(A.CompanyID*1000,0)+ISNULL(C.PersonID,0) AS CompanyPersonID, A.UserOfficeID, A.CompanyID, B.CompanyName, C.[Name]
FROM
	dbo.tblClient_Company AS A INNER JOIN
	dbo.tblContact_Company AS B ON B.CompanyID = A.CompanyID INNER JOIN
	dbo.tblContact_Person AS C ON C.CompanyID=A.CompanyID OR C.PersonID=0 INNER JOIN
	dbo.tblClient_Person AS D ON D.PersonID=C.PersonID
GO
CREATE UNIQUE CLUSTERED INDEX PK_vwClient_CompanyPerson ON vwClient_CompanyPerson (CompanyPersonID)
GO
CREATE FULLTEXT INDEX ON vwClient_CompanyPerson(
	CompanyName LANGUAGE [Simplified Chinese], 
	[Name] LANGUAGE [Simplified Chinese]
)KEY INDEX PK_vwClient_CompanyPerson ON [FD_Catalog] WITH CHANGE_TRACKING AUTO
GO
LongRui888 2013-12-10
  • 打赏
  • 举报
回复
引用 7 楼 yupeigu 的回复:
[quote=引用 6 楼 lyserver 的回复:] [quote=引用 4 楼 yupeigu 的回复:] [quote=引用 2 楼 lyserver 的回复:] 不好意思,标题写错了,如何写成如休了。
你要给CompanyPersonID 这个加上not null的约束,好像不行,我觉得还不如把语句改成这样: ALTER VIEW [dbo].[vwClient_CompanyPerson] WITH SCHEMABINDING AS SELECT isnull(A.CompanyID*1000,0)+isnull(B.PersonID,0) AS CompanyPersonID, A.CompanyID, B.PersonID FROM dbo.tblCompany AS A INNER JOIN dbo.tblPerson AS B ON B.CompanyID=A.CompanyID [/quote] 谢谢。本来CompanyID和PersonID是NOT NULL的,用A.CompanyID*1000+B.PersonID语句后变成了NULL的了,没能继承它们本身的NOT NULL约束。[/quote] 啊,奇怪了,照理,不应该呀,你的试图肯定是没问题的,你的建索引的语句,能给出来不[/quote] 这个是我写的一个例子:
--drop table t1,t2

--1.建表
create table t1(id int)

create table t2(id int)
go


--2.建索引试图
create VIEW [dbo].[vwClient_CompanyPerson]
WITH SCHEMABINDING
AS
SELECT
	A.ID*1000+B.ID AS CompanyPersonID, A.ID, B.ID as idd
FROM
	dbo.t1 AS A INNER JOIN
	dbo.t2 AS B ON B.id=A.ID
go

--drop index idx_t123 on [vwClient_CompanyPerson]


--3.给试图建个索引,没有报错
create  unique clustered index idx_t123 on [vwClient_CompanyPerson]
(CompanyPersonID)
/*
命令已成功完成。
*/
shoppo0505 2013-12-10
  • 打赏
  • 举报
回复
视图中你使用的是inner join,如果数据源表中数据都是not null,不可能在这里出现null的情况,建议完善数据值。你现在是治标不治本。
LongRui888 2013-12-10
  • 打赏
  • 举报
回复
引用 6 楼 lyserver 的回复:
[quote=引用 4 楼 yupeigu 的回复:] [quote=引用 2 楼 lyserver 的回复:] 不好意思,标题写错了,如何写成如休了。
你要给CompanyPersonID 这个加上not null的约束,好像不行,我觉得还不如把语句改成这样: ALTER VIEW [dbo].[vwClient_CompanyPerson] WITH SCHEMABINDING AS SELECT isnull(A.CompanyID*1000,0)+isnull(B.PersonID,0) AS CompanyPersonID, A.CompanyID, B.PersonID FROM dbo.tblCompany AS A INNER JOIN dbo.tblPerson AS B ON B.CompanyID=A.CompanyID [/quote] 谢谢。本来CompanyID和PersonID是NOT NULL的,用A.CompanyID*1000+B.PersonID语句后变成了NULL的了,没能继承它们本身的NOT NULL约束。[/quote] 啊,奇怪了,照理,不应该呀,你的试图肯定是没问题的,你的建索引的语句,能给出来不
lyserver 2013-12-10
  • 打赏
  • 举报
回复
引用 4 楼 yupeigu 的回复:
[quote=引用 2 楼 lyserver 的回复:] 不好意思,标题写错了,如何写成如休了。
你要给CompanyPersonID 这个加上not null的约束,好像不行,我觉得还不如把语句改成这样: ALTER VIEW [dbo].[vwClient_CompanyPerson] WITH SCHEMABINDING AS SELECT isnull(A.CompanyID*1000,0)+isnull(B.PersonID,0) AS CompanyPersonID, A.CompanyID, B.PersonID FROM dbo.tblCompany AS A INNER JOIN dbo.tblPerson AS B ON B.CompanyID=A.CompanyID [/quote] 谢谢。本来CompanyID和PersonID是NOT NULL的,用A.CompanyID*1000+B.PersonID语句后变成了NULL的了,没能继承它们本身的NOT NULL约束。
lyserver 2013-12-10
  • 打赏
  • 举报
回复
引用 1 楼 shoppo0505 的回复:
view是视图,没有表结构,使用对列使用约束,只能对select添加where条件。 你在from后添加 where CompanyPersonID is not null就可以。
谢谢回复,我不是要在条件中加判断,而是想直接指定视图计算列的NULL属性为False,以尝试以CompanyPersonID为主键后能不能创建该视图的全文索引,因为直接创建全文索引时会失败,提示“不是可强制使用全文搜索键的有效索引”。
LongRui888 2013-12-10
  • 打赏
  • 举报
回复
引用 2 楼 lyserver 的回复:
不好意思,标题写错了,如何写成如休了。
你要给CompanyPersonID 这个加上not null的约束,好像不行,我觉得还不如把语句改成这样: ALTER VIEW [dbo].[vwClient_CompanyPerson] WITH SCHEMABINDING AS SELECT isnull(A.CompanyID*1000,0)+isnull(B.PersonID,0) AS CompanyPersonID, A.CompanyID, B.PersonID FROM dbo.tblCompany AS A INNER JOIN dbo.tblPerson AS B ON B.CompanyID=A.CompanyID
Landa_Peter 2013-12-10
  • 打赏
  • 举报
回复

2
3
4
5
6
7
8
 
ALTER VIEW [dbo].[vwClient_CompanyPerson]
WITH SCHEMABINDING
AS
SELECT
    A.CompanyID*1000+B.PersonID AS CompanyPersonID, A.CompanyID, B.PersonID
FROM
    dbo.tblCompany AS A INNER JOIN
    dbo.tblPerson AS B ON B.CompanyID=A.CompanyID
 
select * from vwClient_CompanyPerson where CompanyPersonID is not null
lyserver 2013-12-10
  • 打赏
  • 举报
回复
不好意思,标题写错了,如何写成如休了。
shoppo0505 2013-12-10
  • 打赏
  • 举报
回复
view是视图,没有表结构,使用对列使用约束,只能对select添加where条件。 你在from后添加 where CompanyPersonID is not null就可以。

22,302

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧