代码之家  ›  专栏  ›  技术社区  ›  George Johnston

SQL Server-为记录集使用自定义字段的优雅方式

  •  1
  • George Johnston  · 技术社区  · 15 年前

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

    该视图包含我的所有员工数据。约束表包含字段名,该字段名引用视图字段名,以及一个表示选择该字段的位。

    视图示例:

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

    约束表示例:

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

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

    Name   | Weight
    Peter  | 180
    Martha | 115
    

    关于如何处理这个问题有什么想法吗?

    谢谢!

    2 回复  |  直到 15 年前
        1
  •  1
  •   Paul Creasey    15 年前
    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仇恨者。

    像使用表或视图这样的方法并不容易,但它是可能的,首先将其包装在存储过程中,然后创建链接服务器“环回”

    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') 
    
        2
  •  5
  •   gbn    15 年前

    如果没有动态SQL,就不能:SQL是“固定列协定”语言

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