我用以下代码创建一个视图
SELECT
CONVERT(NVARCHAR, YEAR(okuma_tarihi)) + 'T1' AS sno,
YEAR(okuma_tarihi) AS Yillar,
SUM(toplam_kullanim_T1) AS TotalUsageValue, 'T1' AS UsageType
FROM
TblSayacOkumalari
GROUP BY
CONVERT(NVARCHAR, YEAR(okuma_tarihi)) + 'T1', YEAR(okuma_tarihi)
UNION ALL
SELECT
CONVERT(NVARCHAR, YEAR(okuma_tarihi)) + 'T2' AS sno,
YEAR(okuma_tarihi) AS Yillar,
SUM(toplam_kullanim_T2) AS TotalUsageValue, 'T2' AS UsageType
FROM
TblSayacOkumalari
GROUP BY
CONVERT(NVARCHAR, YEAR(okuma_tarihi)) + 'T1', YEAR(okuma_tarihi)
UNION ALL
SELECT
CONVERT(NVARCHAR, YEAR(okuma_tarihi)) + 'T3' AS sno,
YEAR(okuma_tarihi) AS Yillar,
SUM(toplam_kullanim_T3) AS TotalUsageValue, 'T3' AS UsageType
FROM
TblSayacOkumalari
GROUP BY
CONVERT(NVARCHAR, YEAR(okuma_tarihi)) + 'T1', YEAR(okuma_tarihi)
我想将
CONVERT(nvarchar, YEAR(okuma_tarihi)) + 'T1' AS sno
定义为主键,可以吗?如果这可能我该怎么办?
您无法在视图上创建主键。 在 SQL Server 中,您可以在视图上创建索引,但这与创建主键不同。
如果您向我们提供更多信息,说明为什么您希望在视图中添加关键信息,也许我们可以提供帮助。
您可能无法创建主键(按说法),但如果您的视图基于具有主键的表并且该键包含在视图中,那么主键也将反映在视图中。 需要主键的应用程序可以接受视图,就像 Lightswitch 的情况一样。
参加这个聚会有点晚了 - 但这也很有效:
CREATE VIEW [ABC].[View_SomeDataUniqueKey]
AS
SELECT
CAST(CONCAT(CAST([ID] AS VARCHAR(4)),
CAST(ROW_NUMBER() OVER(ORDER BY [ID] ASC) as VARCHAR(4))
) AS int) AS [UniqueId]
,[ID]
FROM SOME_TABLE JOIN SOME_OTHER_TABLE
GO
在我的例子中,连接导致 [ID] - 主键重复最多 5 次(关联不同的唯一数据) 这样做的一个好技巧是可以从每个 UniqueID 确定原始 ID 实际上 [ID]+RowNumber() = 11, 12, 13, 14, 21, 22, 23, 24 等。 如果将 RowNumber() 和 [ID] 添加回视图中 - 您可以轻松地从数据中确定原始键。 但是 - 这不是应该提交给表的东西,因为我相当确定视图的 RowNumber() 永远不会可靠地与基础数据更改相同,即使使用 OVER(ORDER BY [ID] ASC)尝试帮助它。
示例输出( 从 [REF].[View_Systems] 中选择 UniqueId、ID、ROWNR、名称):
UniqueId ID ROWNR Name
11 1 1 Amazon A
12 1 2 Amazon B
13 1 3 Amazon C
14 1 4 Amazon D
15 1 5 Amazon E
表1:
[ID] [Name]
1 Amazon
表2:
[ID] [Version]
1 A
1 B
1 C
1 D
1 E
CREATE VIEW [REF].[View_Systems]
AS
SELECT
CAST(CONCAT(CAST(TABA.[ID] AS VARCHAR(4)),
CAST(ROW_NUMBER() OVER(ORDER BY TABA.[ID] ASC) as VARCHAR(4))
) AS int) AS [UniqueId]
,TABA.[ID]
,ROW_NUMBER() OVER(ORDER BY TABA.[ID] ASC) AS ROWNR
,TABA.[Name]
FROM [Ref].[Table1] TABA LEFT JOIN [Ref].[Table2] TABB ON TABA.[ID] = TABB.[ID]
GO
在 SQL Server 查询设计器中创建视图后,出现错误“表/视图 'dbo.vMyView' 没有定义主键”。我通过在列上使用 ISNULL 来强制实体框架将其用作主键来解决该问题。您可能需要重新启动 Visual Studio 才能使警告消失。
CREATE VIEW [dbo].[vMyView]
AS
SELECT ISNULL(Id, -1) AS IdPrimaryKey, Name
FROM dbo.MyTable
这对我有用..
SELECT ROW_NUMBER() over (...order by column_name_of your choice...)
AS pri_key, ...the other columns of the view...
正如其他答案中所述,您无法在视图上创建主键。也许您遇到了实体框架错误消息
Error 6002: The table/view does not have a primary key defined
并在谷歌上搜索了“如何使用主键创建视图”,这让您找到了这个问题。如果这是您的场景,您可以使用 [Key]
属性在对象模型中定义表示视图行的 PK,这比使用不必要的空检查、分区或索引来伪造视图要优雅得多。您也可以多次使用此属性:
public class KycHierarchyView
{
[Key]
[Column(Order = 0)]
public int FirstKeyColumn { get; set; }
[Key]
[Column(Order = 1)]
public int SecondKeyColumn { get; set; }
public int SomeOtherData { get; set; }
}