【问题标题】:Select specific columns from the stored procedure从存储过程中选择特定列
【发布时间】:2021-10-04 07:00:53
【问题描述】:

我在其他团队维护的其他数据库中有一个存储过程。假设它当前返回 3 列,而我的系统只需要这 3 列 但是其他团队可以添加更多列供自己使用,这导致我的系统失败。

其他数据库SP

ALTER PROCEDURE FirstSP 

AS
BEGIN
    
    SET NOCOUNT ON;

    CREATE TABLE #A (Id INT, Name VARCHAR(200), Amount VARCHAR(100), TestColumn INT)
    INSERT INTO #A VALUES
    (1,'ABC','23',1), (2,'CDF','35454',2), (3,'hjhj','9809909',3)

    SELECT * FROM #A

    DROP TABLE #A
  
END
GO

下面是我的查询,它只期望来自源的 3 列

CREATE TABLE #MyTable (Id INT, Name VARCHAR(200), Amount INT)

INSERT INTO #MyTable
EXEC dbo.FirstSP;  

SELECT * FROM #MyTable

DROP TABLE #MyTable

有什么方法可以提供列列表吗?

这是我正在尝试的,但似乎我不能使用服务器名称作为参数

DECLARE @ServerName VARCHAR(100) = @@SERVERNAME

SELECT * FROM OPENQUERY(@ServerName,'EXEC dbo.FirstSP')

我的整个问题是从 SP 中选择所需的列。 SP 以后可以有很多列。

【问题讨论】:

  • 将 sp 转换为 tvf 是一种选择吗?或者,您可以select * into 一个临时表,FirstSP 返回的所有列,然后从应用程序的临时表中仅选择您想要的内容。
  • 我该怎么做 SELECT * INTO ?如果那行得通,那我很好。我正在尝试这个,但这不起作用 SELECT * INTO #A EXEC dbo.FirstSP
  • 你会这样做 CREATE TABLE {TableName}... INSERT INTO {TAbleName} EXEC {YOurProcedure} @Zerotoinfinity 。但实际上,如果您只想要某些列,那么您可能不需要过程并需要内联表值函数。过程的设计目的不是让其数据以与SELECT 相同的方式使用。
  • @Larnu 但问题是我不确定将来是否会添加新列。在我的例子中。 SP 有 4 列,我预计只有 3 列
  • 如果您的过程返回 4 列,而您期望 3 列,那么您的期望是错误的。你应该期待 4.

标签: sql tsql sql-server-2016


【解决方案1】:

试试这个:

/*
    -----------------------------------------------------------------------
    Replace <SERVERNAME>\<INSTANCENAME>], <DATABASENAME> with your names
*/  ------------------------------------------------------------------------

-- First, enable Data Access (One time only)    
EXEC sp_serveroption '<SERVERNAME>\<INSTANCENAME>', 'DATA ACCESS', TRUE;

-- Then SELECT just the fields you need
SELECT  ID, Name, Amount
FROM    OPENQUERY([<SERVERNAME>\<INSTANCENAME>], 'EXEC <DATABASENAME>.dbo.FirstSP')

【讨论】:

  • 为以后的用户加起来;首先我使用下面的查询来创建一个自循环链接服务器,然后使用答案 EXEC master.dbo.sp_addlinkedserver @server = N'LOOPBACK', @srvproduct=N'', @provider=N'SQLNCLI11', @ 中提到的查询datasrc=N'DEVSQL01'
  • 你可以用我的评论更新答案。这对我有用。首先我创建了自循环链接服务器,然后我使用了您的查询。
【解决方案2】:

我会要求开发存储过程的团队创建一个参数“Team”或其他东西,并稍微更改 sp,以便它根据此参数返回预期的列。

一个更麻烦的解决方案是使用这个存储过程来获取sp返回的(第一个)结果的列名。

sp_describe_first_result_set 'dbo.usp_mySp';

然后使用结果创建一些动态SQL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多