【发布时间】: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