小编Jef*_*ark的帖子

sp_msforeachdb 在幕后究竟是如何工作的?

我需要解决我遇到的问题,我需要一些帮助来了解 sp_msforeachdb 的工作原理以解决我的问题。

每次运行 sp_msforeachdb 时都会发生错误 Msg 102, Level 15, State 1, Incorrect syntax near '61'

我的代码示例如下:

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                     FROM ?.sys.objects
                     WHERE name like ''%aetna%''
Run Code Online (Sandbox Code Playgroud)

但是,我将什么查询作为 sp_msforeachdb 的参数并不重要。每次我都遇到同样的错误。我确实有一个以“61s1d”开头的数据库,所以我认为它的数据库名称有问题,但老实说,我不知道 sp_msforeachdb 的幕后情况。

注意事项。

  • 它是唯一以数字开头的数据库
  • 我可以尝试使用类似“如果数据库就像 '%61%' 不要做......”这样的代码,但仍然是同样的错误。
  • 我无法测试更改数据库名称——连接到它的东西太多。
  • 如果我创建一个以“51”开头的测试数据库,那么我也会收到该数据库的错误

我怎样才能克服这个问题?

sql-server stored-procedures t-sql

9
推荐指数
2
解决办法
3643
查看次数

多个存储过程中的相同代码

我最近加入了一家公司,我刚刚注意到许多存储过程都有相同的代码段重复。我注意到是因为我的任务是在它发生的每个 SP 中更改该代码的一小部分:)

这是一段相当大的代码,大约 30 行。该代码是插入语句的一部分,它基本上将 4 个表与WHERE/AND从 SP 到 SP 并没有真正改变的条件连接在一起。它看起来类似于下图:

...
...
FROM <TableOne>
  INNER JOIN <TableTwo> ON ...
    AND .....
    AND .....
  LEFT JOIN <TableThree> ON ...
    AND .....
    AND .....
WHERE .....
  AND .....
  AND .....
  AND MedicalPlanCode IN ('abc', 'def', 'ghi')
Run Code Online (Sandbox Code Playgroud)

唯一从 SP 更改为 SP 的部分是值('abc', 'def', 'ghi'

这些值的数量也可能不同,因此某些 SP 将具有 2 个值,其他 SP 将具有 5 个,等等......

我想到的一切都将那部分代码更改为动态 SQL,我不确定这是否值得。然而,我的程序员讨厌这种情况。

我应该尝试实现某种形式的代码重用吗?它会有投资回报率吗?我有哪些选择?我不得不经历大约 100 个存储过程,大约需要一个小时。

这 100 个 SP 分布在 20 个左右不同的数据库中。我确实有权创建视图。

sql-server stored-procedures t-sql

8
推荐指数
1
解决办法
1438
查看次数

是否可以在视图中进行此数学运算?

我的任务是为客户创建一个视图。具体来说,它必须在一个视图中。但是,我不确定如何在视图中进行一些数学运算。我不知道这是否可能。但话又说回来,我的心很虚弱。

我使用的是 SQL Server 2008R2,因此高级OVER()功能不起作用。

假设一个人有 400 美元可以花。他们可以花更多的钱,但前 400 美元是免费的。报告的一列将显示该人在某事上花费的金额,另一列将显示该人需要自掏腰包支付的总金额

因此,对于此人的报告中的第一条记录,一列将显示他们已花费的金额,例如 50 美元,然后第二列将显示 0 美元。在幕后,他们还有 350 美元可以花。

下一个记录是该人花费 300 美元。第二列仍将显示 0 美元,而在幕后,最初的 400 美元现在是 50 美元。

该人的第三项记录显示他们花了 75 美元,但他们从最初的 400 美元中只剩下 50 美元。第二列现在应该有 25 美元的价值。他们已经用尽了最初的 400 美元,现在正在花自己的钱。

第四条记录显示他们花了 40 美元,所以现在第二列将显示 65 美元。等等...

我已经简要阅读了 CTE 和表值函数等,但是是否可以将它们以任意组合使用以提供上述所需的行为?

以下是结构和所需结果的一些示例代码

CREATE TABLE Payroll (
    PersonID int,
    PlanCode varchar(10),
    Deduction int NULL
)
GO

INSERT INTO Payroll (PersonID, PlanCode, Deduction)
VALUES (1, 'Medical', 200)
  ,(1, 'Dental', 250)
  ,(1, …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2 view running-totals

7
推荐指数
3
解决办法
605
查看次数