【问题标题】:SQL Server -- Elegant way to use custom fields for record setSQL Server——使用记录集自定义字段的优雅方式
【发布时间】:2010-01-27 05:26:45
【问题描述】:

我正在寻找一种从视图中选择字段的优雅方式,其中第二个支持表定义应选择的字段。

视图包含我的所有员工数据。约束表包含引用视图字段名称的字段名称和表示选择该字段的位。

视图示例:

Name   | Age | Weight
Peter  | 38  | 180
Martha | 25  | 115

约束表示例:

Field  | Enabled
Name   | 1
Age    | 0
Weight | 1

...运行查询后,应返回以下数据:

Name   | Weight
Peter  | 180
Martha | 115

关于如何解决这个问题的任何想法?

谢谢!

【问题讨论】:

  • 尝试使用表值函数,在其中构建动态 sql SELECT 语句,然后可以在另一个查询中使用它,加入等
  • 在访问和设计数据库时,优雅是一件非常糟糕的事情。首先尝试有效性和性能,优雅通常是查询数据库的最糟糕的方式。
  • 我被交给了一些非常讨厌的 TSQL,但我无法更改决定的架构——现在它是一堆游标,几乎无法理解。

标签: sql-server tsql


【解决方案1】:

没有动态 SQL 就不行:SQL 是一种“固定列契约”语言

我建议使用客户端中的约束数据来隐藏数据,不要在数据库中这样做

【讨论】:

    【解决方案2】:
    DECLARE @TABLE TABLE
    ( field varchar(70),
    [enabled] int)
    
    DECLARE @SELECT VARCHAR(MAX)
    SET @SELECT = ''
    INSERT INTO @TABLE VALUES ('Name',1)
    INSERT INTO @TABLE VALUES ('Age',0)
    INSERT INTO @TABLE VALUES ('Weight',1)
    
    SELECT  @SELECT = @SELECT + field + ', '
    FROM @TABLE
    WHERE [enabled] = 1
    
    SET   @SELECT = LEFT(@SELECT,LEN(@SELECT)-1)     --trim last ,
    
    SET @SELECT = 'SELECT ' + @SELECT + ' FROM MyView'
    
    PRINT @SELECT
    --EXEC @SELECT
    

    将执行

    SELECT Name, Weight FROM MyView
    

    带上动态 sql 仇恨者。

    像表或视图一样使用它不是微不足道的,但有可能,首先将其包装在存储过程中,然后创建一个链接服务器'loopback'

    if exists (select * from master..sysservers where srvname = 'loopback')
        exec sp_dropserver 'loopback'
    go
    exec sp_addlinkedserver @server = N'loopback',
        @srvproduct = N'',
        @provider = N'SQLOLEDB', 
        @datasrc = @@servername
    go
    

    那么你可以使用下面的语法:

    select * FROM openquery(loopback, 'exec yourSproc') 
    

    【讨论】:

    • 哇——太棒了。我有点迷茫,不过,如果没有循环遍历字段,你是怎么做到的?
    • 所以现在客户端代码获得了不同的列名、数据类型和可空性......也就是客户端如何知道它不会“老化”?现在,这个动态 SQL 肯定会破坏 client-db 合同
    • @gbn,你绝对正确,在客户端应用程序中使用它是不明智的,尽管有很多方法仍然可以工作,只是取决于要求。
    • 扑通扑通!将其包装在表值函数中,您可以像视图一样使用它并加入它
    • @KM,不是你不能那样做,表值 UDF 只返回一个固定类型
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2019-05-01
    • 2011-11-13
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    相关资源
    最近更新 更多