Sql server 2008 在查找中显示两个字段
首先是引言,最后是问题。请仔细阅读! 我在两个表之间有一个主-明细关系:Sql server 2008 在查找中显示两个字段,sql-server-2008,asp.net-3.5,dynamic-data,Sql Server 2008,Asp.net 3.5,Dynamic Data,首先是引言,最后是问题。请仔细阅读! 我在两个表之间有一个主-明细关系: CREATE TABLE [dbo].[LookupAttributes] ( [Id] int IDENTITY (1, 1) NOT NULL, [Name] nvarchar (255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL) ; ALTER TABLE [dbo].[LookupAttributes] ADD CONSTRAINT [PK_Lo
CREATE TABLE [dbo].[LookupAttributes] (
[Id] int IDENTITY (1, 1) NOT NULL,
[Name] nvarchar (255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL) ;
ALTER TABLE [dbo].[LookupAttributes] ADD CONSTRAINT [PK_LookupAttributes] PRIMARY KEY ([Identity]) ;
CREATE TABLE [dbo].[Lookup] (
[Id] int IDENTITY (1, 1) NOT NULL,
[LookupAttributesLink] int NOT NULL,
[Code] nvarchar (20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Value] nvarchar (80) COLLATE SQL_Latin1_General_CP1_CI_AS NULL) ;
ALTER TABLE [dbo].[Lookup] ADD CONSTRAINT [IX_Lookup] UNIQUE ([LookupAttributenLink], [Code]) ;
两个表中都有更多的字段和索引,但这些才是最重要的。。。
我正在从事的项目旨在维护50多个表中的数据,每周这些数据都会导出为XML,供某些桌面应用程序用作源数据。虽然我想让它成为一个漂亮的应用程序,但它只需要快速完成,因此我使用了一个动态数据站点,以便可以维护数据。除了这张桌子外,一切都很好。。。
事实证明,有600条不同的查找记录共享相同的代码,但属性不同。DDS在查找记录列表中正确显示属性和代码,这样就不会混淆某人正在编辑的查找记录。这已经使用了两年多了。
现在的问题是:添加了一个新的表查找覆盖,它链接到查找表的[Id]字段。因此,这个新表中的每条记录都会显示[Code]字段,但由于[Code]不是唯一的,所以不清楚哪个覆盖记录属于哪个查找记录。
为了解决这个问题,我需要显示查找记录中的更多信息。由于唯一唯一的字段集是attribute plus代码,因此我需要同时显示这两个字段。但是显示[LookupAttributesLink]+[Code]也不是一个选项,因为[LookupAttributesLink]只是一个数字。我需要DDS在单个列中显示[Attributes].[LookupAttributesLink]+[Lookup].[Code]。问题是:怎么做?我考虑过向查找表中添加一个计算字段,但我无法通过这种方式获取属性名称。我可以创建一个特殊页面来维护此表,但我也不喜欢这种解决方案,因为在我看来,它打破了DDS原则。我试图避免这样的页面。那么,有没有其他方法可以让站点在覆盖表中同时显示属性名和查找代码?
最有趣的解决方案是使用可以检索属性名的计算字段。怎么做
我自己解决了!请参阅下面的答案,它的效果很好。找到了!我必须做几件事:
CREATE FUNCTION LookupName (
@Attr int,
@Code nvarchar(255)
) RETURNS nvarchar(1000)
AS
BEGIN
DECLARE @Name nvarchar(1000)
SELECT @Name = Name
FROM [dbo].[LookupAttributes]
WHERE [Id]=@Attr;
RETURN @Name + '/' + @Code;
END
GO
ALTER TABLE [dbo].[lookup] ADD [Name] AS [dbo].[LookupName]([LookupAttributesLink], [Code])
GO
这将向使用函数计算正确名称的表中添加一个额外的计算字段。然后,我不得不为查找表添加一些元数据:
[MetadataType(typeof(LookupMetadata))]
public partial class Lookup { }
[DisplayColumn("Name", "Name")]
[DisplayName("Lookup")]
public class LookupMetadata
{
[ScaffoldColumn(false)]
public int Id;
[ScaffoldColumn(false)]
public object Name;
}
这将在查找表本身中隐藏“名称”列,但会使其在替代表中可见。它将用于显示正确的值。
这样做,解决了问题!其实很容易-