我有一个返回结果的存储过程,假设它返回产品行。但是每个产品状态都不在我们手中(无法获得)。我们的DBA只是给了我们另一个存储过程来获取产品的状态。我们需要通过致电他们的SP来获得个人产品状态。假设我们有产品表,
CREATE TABLE PRODUCTS
(
ID INT,
Name NVARCHAR(100)
)
CREATE PROCEDURE GetProducts
AS
BEGIN
INSERT INTO #TEMPTABLE
SELECT * FROM PRODUCTS; -- Yes Too Much simplified
-- Create cursor and set additional status in #TEMPTABLE
END;
EXEC GetStatus @ProductId; -- SP That need to get status
问题是GetStatus只是获取状态的方法,这个sp有时会返回2列,有时是4列,有时是8列。返回列将始终包含Status列。
如果列名已修复,则没有问题。是否有一种方法可以在执行SP时创建动态表。
试过这个但没有用,
WITH DynamicTable AS
(
EXEC GetStatus
)
答案 0 :(得分:3)
你的问题的答案是否定的。没有良好方法来获取可以返回动态列集的存储过程返回的特定列的值。
我说不好"好"方式,因为当然有一种方式。您可以为过程可以返回的每个可能的列写一个INSERT EXEC语句,并将每个列包装在TRY..CATCH块中。如果第一个出错,请尝试下一个。一旦你找到一个没有错误的错误,从中获取状态,然后跳过其余部分。
这是你问题的答案。但是,问题的解决方案是使用表值函数替换GetStatus存储过程。然后你可以从中选择,加入它等等。我认为函数必须总是返回一致数量的列,但无论如何都会更好,并且在特定情况下不需要的列可以只是留空或NULL。