sql-server - 使用动态 SQL 创建报告

标签 sql-server function stored-procedures dynamic-sql

我有一个这样的表格示例:

State   Project Build Type  ACTUAL0     ACTUAL1     ACTUAL2  
------- ------- ----------- ----------- ----------- ----------
Ohio    154214  Residential 1/5/2013    2/25/2013   7/12/12  
Utah    214356  Commercial  7/08/13     6/9/13      7/1/12

我正在尝试创建一个报告,该报告采用以单词“actual”开头的列标题,并计算有多少日期小于特定日期。我创建了一个临时表,其中的列标题以“实际”一词开头。这只是一个例子,实际有超过 250 个列名称。所以表格看起来像这样:

MilestoneNmbr  
-------------
ACTUAL1  
ACTUAL2  
ACTUAL3  

现在我认为可行的方法是将行作为列标题的变量并将日期传递到函数中。这是我创建的函数:

CREATE FUNCTION [dbo].[GetMSActualCount] 
(
    @ACTUAL nvarchar(16),
    @DATE nvarchar(16)
)
RETURNS int
AS
BEGIN
DECLARE @ACTUALRETURN int
    DECLARE @SQL nVarchar(255) = 
    'SELECT COUNT(' + @ACTUAL + ') AS Expr1
    FROM [CASPR_MILESTONES_000-036]
    WHERE '+ @ACTUAL +' > ' + @DATE
exec sp_executesql @SQL, N''
SET @ACTUALRETURN = @SQL
    -- Return the result of the function
    RETURN @ACTUALRETURN

END

如果我运行以下查询:

DECLARE @DATE varchar(20)
SET @DATE = '''1/1/2013'''
SELECT MilestoneNmbr, dbo.getMSActualCount(milestonenmbr,@Date) from #List_CASPR_Milestones

所以我的错误是我不能在函数中使用动态 SQL。既然如此,我能做什么呢?我认为我在这里的简单查询将变成数百行。还有其他简单的方法可以做到这一点吗?

编辑:

我正在寻找的结果是这样的:

MilestoneNmbr   CountofDate  
--------------- ------------
ACTUAL1         200  
ACTUAL2         344  
ACTUAL3         400  

最佳答案

你是对的,你不能在函数中使用动态 SQL。有两个答案:

首先,你的表有 250 列 ACTUAL 加上一个数字,这简直就是一场噩梦。您无法使用 SQL 擅长提供帮助的任何内置功能。你应该有两张 table 。首先是一个项目表,其中包含 ID 列以及 State、Project 和 BuildType 列。然后是 ProjectDates 表,其中包含引用第一个表的 ProjectID 列,然后是 ActualDate 列。从中进行报告应该很容易。

鉴于您可能无法修复结构,请尝试编写存储过程。即可以使用动态SQL。更好的是,您的存储过程可以创建如上所述的临时表,然后使用它们进行统计。

关于sql-server - 使用动态 SQL 创建报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18646780/

相关文章:

javascript - jQuery 2.x - .on 函数无法正常工作

sql - Inner Join 是否存在性能问题?

mysql - 调用存储过程对数组执行计数

sql-server - 在我的情况下是 NOLOCK、Snapshot 还是其他?

mysql - 数据库中已删除记录的数字主键是否会被重新用于 future 的新记录?

C++ & Lua,推送 Lua 表作为参数

c# - SQL CLR中的存储过程

sql-server - 在 VBScript 中将字符串转换为唯一标识符

c# - 将数据从 XML 导入到 SQL Server 表

php - 从静态方法调用非静态方法