代码之家  ›  专栏  ›  技术社区  ›  Eppz

如何使用dynamicfrom子句创建存储过程

  •  0
  • Eppz  · 技术社区  · 17 年前

    我遇到了一个应用程序的问题,该应用程序反复使用相同的存储过程来填充下拉列表中的人员信息。问题是,随着数据的变化,有时人们不再在场。我有两个视图可供选择,但我希望根据应用程序的状态动态更改正在使用的视图。

    对于新记录,我只想看到当前的人。如果我正在更新现有记录,我可能希望看到所有人,因为现有记录可能引用不再是当前记录的人。

    如何将视图名称传递到存储过程中,以便从中进行选择?

    我已经尝试添加:

    @view varchar(50)
    
    select a, b from @view
    

    这可能吗?

    7 回复  |  直到 17 年前
        1
  •  2
  •   Rockcoder    17 年前

    如果只使用两个视图,并且知道它们的名称,则只需向过程传递一个位参数即可。

    @useFirstView bit
    
    IF @useFirstView = 1 
       -- select from firstView
    ELSE
       -- select from secondView
    
        2
  •  2
  •   Austin Salonen gmlacrosse    17 年前

    您可以在SP中创建语句并调用:

    exec sp_executesql @sql
    
        3
  •  1
  •   Borislav T    16 年前

    http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/fa523f21-5a8b-421f-99ce-9bb2ec30e848

    最后看看萨米·萨米尔的答案——至少对我来说,它提供了一个完美的解决方案,我希望它也能为你提供同样的解决方案。

    祝你一切顺利。

        4
  •  0
  •   Nathan Koop    17 年前

    您可以使用动态SQL来解决您的问题。

    DECLARE @sqlCommand varchar(1000)
    SET @sqlCommand = 'SELECT a, b from FROM ' + @view
    EXEC (@sqlCommand)
    

    但我不认为这是最好的解决方案。您可能应该有这样一个查询

    If @IsActiveFlag = TRUE THEN
      SELECT * FROM People WHERE IsActive = 1
    ELSE
      SELECT * FROM People
    ENDIF
    
        5
  •  0
  •   tster    17 年前

    您是否尝试过在存储过程中声明变量并将参数指定为其值?

    例如,假设您有一个名为@view的参数:

    声明@viewName nvarchar(50)

    设置@viewName=@view

        6
  •  -1
  •   Kevin Vaughan    17 年前

    DECLARE @view VARCHAR(50)
    SET @view = 'myView'
    SELECT a,b FROM @view
    

    或者如果在存储过程中使用

    CREATE PROCEDURE SelectFromView
    {
        @view VARCHAR(50)
    }
    AS
    BEGIN
    
        DECLARE @sqlCommand varchar(1000)
        SET @sqlCommand = 'SELECT a, b from FROM ' + @view
        EXEC (@sqlCommand)
    
    END
    

    像前面提到的那样,在这方面要小心SQLInjection攻击。

    [编辑] 更正了使用Nathan Koop,thx的代码创建动态sql。 [/编辑]

        7
  •  -1
  •   liggett78    17 年前

    你的想法很吸引人,但这不受支持(为什么这里的人甚至建议声明一个变量?),或者,换句话说,你做得不对。

    表变量如下所示:

    DECLARE @table TABLE (a int, b int).
    

    注意,它的类型是TABLE,而不是VARCHAR。之后,您可以执行以下操作:

    SELECT a,b FROM @table.
    

    但显然这不是你想要的。我建议使用sp_executesql(仅当视图/表名由您设置,而不是来自用户数据或类似数据时)或if-ELSE语句。