【问题标题】:Returning Data without Accesing a Table在不访问表的情况下返回数据
【发布时间】:2010-11-25 11:17:29
【问题描述】:

情况(忽略这个很无聊): 我有使用报告服务创建的报告。其中一些报告采用参数“月”。他们输入他们想要的月份的整数。示例:12 月 = 12。 为了查看报告,我只是在 Visual Studio 中使用报告查看器。我需要将月份字段作为下拉框,以便按名称选择月份。报告服务中有一项功能允许您将字段绑定到存储过程,以便为下拉列表创建值/文本对。

问题: 我不想在我的数据库中创建一个“月”表,但我需要一个可以返回所有月/整数对的存储过程。我确信有一个非常简单的解决方案,但我不确定它是什么!我的第一个想法是创建一个临时表,但我不知道如何手动添加每个月/int 对到表中...感谢您的所有建议!

我想要的是以下语句,除了不使用月份表:

SELECT MonthID, MonthName
FROM Months

【问题讨论】:

    标签: sql sql-server tsql reporting-services


    【解决方案1】:

    怎么样:

    CREATE PROCEDURE ListMonths
    AS
    
        SELECT 1 AS MonthId, 'January' AS MonthName
         union all select 2, 'February'
         union all select 3, 'March'
         union all select 4, 'April'
         union all select 5, 'May'
         union all select 6, 'June'
         union all select 7, 'July'
         union all select 8, 'August'
         union all select 9, 'September'
         union all select 10, 'October'
         union all select 11, 'November'
         union all select 12, 'December'
    
    GO
    

    调用它,我相信它会返回你想要的。

    【讨论】:

    • 比创建表格好多了。完美的解决方案。谢谢!
    【解决方案2】:

    您真的需要为此创建一个表吗?您可以手动进行选择:

    
    SELECT 1, 'January' UNION ALL
    SELECT 2, 'February' UNION ALL
    ...
    SELECT 12, 'December'
    

    【讨论】:

      【解决方案3】:

      听起来您需要的是一个视图,基本上您编写一个自定义查询并将其作为表格返回。

      此外,SP 可以只包含一个查询,它会返回一个表,只需将其创建为:

      CREATE PROCEDURE [dbo].[mytable] 
          -- Add the parameters for the stored procedure here
          @inputarg1 = 0
      AS
      BEGIN
          -- SET NOCOUNT ON added to prevent extra result sets from
          -- interfering with SELECT statements.
          SET NOCOUNT ON;
          SELECT  
              .....
          FROM
              .....
          WHERE
              .....
      END
      

      【讨论】:

        【解决方案4】:

        在存储过程中,执行以下操作

        Declare @Months Table 
           (monthNo TinyInt Primary Key Not Null,
            name varChar(10) Not Null,
            Abbrev char(3) = Substring(name,1,3))
        Insert @Months ( monthNo, name) Values (1, 'January')
        Insert @Months ( monthNo, name) Values (2, 'February')
        ...
        Insert @Months ( monthNo, name) Values (12, 'December')
        

        或者,如果您需要在多个存储过程中使用此表,请编写一个UDF,该UDF 会终止相同的内容并将此表返回给调用过程...

        【讨论】:

        • 完美!谢谢!顺便说一句,您有 Abbreviation 字段,但您没有将缩写添加到插入中。谢谢!
        • 缩写字段是一个计算列,基于名称字段的前三个字符...(我想我会添加这个扭曲作为奖励!)
        • 啊。抱歉,我没有选中这个,但我认为不创建表格我会更好。谢谢!
        • 嘿,没关系,没问题,但是你意识到,这个表只是内存中的表,只有在存储的 proc 运行时才存在......然后它就消失了
        【解决方案5】:
        WITH    months AS
                (
                SELECT  CAST('2009.01.01' AS DATETIME) AS m, 1 AS num
                UNION ALL
                SELECT  DATEADD(month, 1, m), num + 1
                FROM    months
                WHERE   num < 12
                )
        SELECT  num, DATENAME(month, m)
        FROM    months
        

        【讨论】:

          猜你喜欢
          • 2013-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-28
          • 1970-01-01
          相关资源
          最近更新 更多