【问题标题】:SQL Server - How do i get multiple rows of data into a returned variableSQL Server - 如何将多行数据放入返回的变量中
【发布时间】:2019-05-05 00:22:38
【问题描述】:

这里的第一个问题,希望有人能提供帮助!

我将 Access 后端转换为 SQL 服务器,将前端保留在 Access 中。

我遇到了一些需要帮助的事情。

在 Access 中,我有一个使用用户定义函数的查询,以便将表中的行中的一些数据合并到一个变量中。 (通过打开一个记录集并枚举,每次添加到一个变量。)

例如:

查询有一个字段调用函数,如下所示:

产品名称:产品(合同 ID)

VBA 函数“Product()”根据 ContractID 搜索表。循环遍历它找到的每一行,并将一个字段的结果连接到一个变量中,最终返回给查询。

显然,将此查询作为视图移动到 SQL 服务器意味着该函数将不会在 Access 中找到。

我可以使用函数或存储过程来做同样的事情吗? (我以前从未使用过它们)

我必须强调,由于非常严格的生产环境安全性,我无法在运行时创建、更改或删除表。

如果有人能给我一个例子,我真的很感激。

所以我需要能够从上面显示的视图中调用它。

假设我正在查看数据的表称为 tbl_Products,它有 2 列:

|合同ID |产品 |

那该怎么做?!任何帮助都非常感谢!

安迪

【问题讨论】:

  • SQL Server 不是 Access,这里需要进行范式转换。没有要运行的 VBA 函数,您的查询需要实现该查找。幸运的是,SQL Server 比 Access 更能做到这一点。您可以使用 CTE、表值函数或仅使用嵌套查询,......无论什么让您的船摇摆不定。但是这里没有人可以为您编写该查询。您需要查看该 VBA 函数在做什么,并为它编写一个等效的 T-SQL 查询......然后使用它。
  • 显然有人可以...非常感谢 Albert D. Kallal 的出色示例和解释。我知道我必须使用 T-SQL 编写一个函数,我只需要一点帮助就可以让我起步。

标签: sql-server tsql ms-access vba


【解决方案1】:

是的,您当然可以在 SQL 中做同样的事情并采用与过去使用 VBA + SQL 相同的方法。

简单的解决方案是链接到视图,然后构建添加附加列的本地查询。但是,通常出于性能和简单地将 sql 从 Access 转换为 T-SQL 的原因,我经常将这些 VBA 函数“复制”为 T-SQL 函数。

这种方法的美妙之处在于,一旦你创建了这个函数,那么这将有助于轻松将一些 Access SQL 转换为 t-sql 和视图。

我在 VBA 中有一个 GST 计算函数,您可以传递金额和日期(因为 GST 税率在已知日期(过去或未来)发生变化。

所以我在我的 Access SQL 中到处使用这个函数。

当我必须转换为 sql server 时,我能够使用 Access 中的“视图”和直通查询,只需使用“非常”相似的 sql 并将该 sql 函数包含在 sql 中,就像我在 Access 中所做的那样.

您需要创建所谓的 SQL 函数。此函数通常称为缩放函数。这个函数就像 VBA 中的函数一样工作。

所以在 t-sql 存储过程中,甚至作为 SQL 中的表达式,就像在 Access 中一样!!!

在您的示例中,假设您有一些合同表,并且您想要获取“状态”列(我们假设文本)。

可能有一个、1 个或“几个”或没有!。

因此,我们将根据合约 ID 连接每个子记录“状态”代码。

因此,您可以启动 SSMS 并在数据库中简单地在树视图中展开您的数据库。现在展开“可编程性”。现在扩展功能。您会看到“标量值函数”。这些函数就像 VBA 函数一样。创建后,您可以在代码(t-sql)或视图等中使用该函数。

此时,您现在可以编写 t-sql 代码来代替 VBA 代码。

实际上,您不必“扩展”上面的树 - 但它可以让您“查找”、“查看”和“更改”您创建的函数。创建后,任何 sql 或该数据库的代码都可以像在 Access 中一样使用该函数作为表达式。

这段代码应该可以解决问题:

CREATE FUNCTION [dbo].[ContractStatus]
 (@ContractID int)

RETURNS varchar(255)
AS
BEGIN
    -- Declare a cursor (recordset)
    DECLARE @tmpStatus varchar(25)
    DECLARE @MyResult varchar(255)
    set @MyResult = ''

    DECLARE rst CURSOR
       FOR select Status from tblContracts where ID = @ContractID
    OPEN rst
    FETCH NEXT FROM rst INTO @tmpStatus
    WHILE @@FETCH_STATUS = 0
    BEGIN
       IF @MyResult <> '' 
          SET @MyResult = @MyResult + ','
       SET @MyResult = @MyResult +  @tmpStatus
       FETCH NEXT FROM rst INTO @tmpStatus
    END

    -- Return the result of the function
    RETURN @MyResult

END

现在,在 sql 中,你可以去:

从 tblProjects 中选择 ProjectName, ID, dbo.ProjectStatus([ID]) 作为 MyStatus。

【讨论】:

  • 非常感谢!对于这一点,这很容易理解。我也能够切碎并更改以从查询中提取两个字段,因此您的描述和编码是正确的!我非常感谢你,希望有一天能回报你。这将使我的生活变得更加轻松!
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 2011-04-19
  • 1970-01-01
  • 2022-06-14
  • 2019-12-04
相关资源
最近更新 更多