2013-02-06 139 views
1
Create FUNCTION [dbo].[fn_GetStockDeatils]() 
RETURNS @Results TABLE 
(
PurchaseData nvarchar(50) NOT NULL 

) 
AS 
    BEGIN 


    Declare @tableName varchar(25) 
    Declare @PKKey numeric(18,0) 

    DECLARE StockCursor CURSOR FOR Select tableName ,PKKey from INVM 
    OPEN StockCursor 
    FETCH StockCursor INTO @tableName ,@PKKey 
     Begin 

     Insert @Results Select PurchaseData from @tableName.PKKey [email protected] 

     END  
    FETCH StockCursor INTO @tableName ,@PKKey 
    close StockCursor 
    DEALLOCATE StockCursor 


     Return 

    END 

我已經寫過這個,但它不能正常工作。 @tableName包含表格的名稱。如果可能,請幫助我。在UDF中使用光標,返回具有不同表名稱的列

+1

這是一個非常非關係數據設計演示。這會導致你很多像這樣的問題。 – RBarryYoung

回答

0

聽起來像你需要一個dynamic SQL commands,但你不能使用函數的動態SQL。爲此你必須創建存儲過程。

CREATE PROCEDURE [dbo].[GetStockDeatils] 
AS 
BEGIN 
DECLARE @tableName varchar(25), 
     @PKKey numeric(18,0), 
     @dsql nvarchar(max) = N'' 

IF OBJECT_ID('tempdb.dbo.#Results') IS NOT NULL DROP TABLE dbo.#Results 
CREATE TABLE dbo.#Results(PurchaseData nvarchar(50) NOT NULL) 

DECLARE StockCursor CURSOR LOCAL FAST_FORWARD FOR 
SELECT tableName ,PKKey 
FROM INVM 
OPEN StockCursor 
FETCH NEXT FROM StockCursor INTO @tableName, @PKKey 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @dsql = 'Insert dbo.#Results Select PurchaseData from ' + @tableName + ' WHERE PKKey = ' + CAST(@PKKey AS varchar(10)) 
    EXEC sp_executesql @dsql 
    FETCH NEXT FROM StockCursor INTO @tableName, @PKKey 
END 
CLOSE StockCursor 
DEALLOCATE StockCursor 

SELECT * 
FROM dbo.#Results 
END 

EXEC [dbo].[GetStockDeatils] 

SQLFiddle

處理創建視圖

CREATE PROCEDURE [dbo].[GetStockDeatils] 
AS 
BEGIN 
DECLARE @dsql nvarchar(max) = N'' 
IF OBJECT_ID('dbo.v_Results') IS NOT NULL DROP VIEW dbo.v_Results 
SELECT @dsql += 
    'UNION ALL SELECT PurchaseData FROM ' + tableName + 
    ' WHERE PKKey = ' + CAST(PKKey AS varchar(10))     
FROM dbo.INVM 
SET @dsql = N'CREATE VIEW dbo.v_Results AS ' + STUFF(@dsql, 1, 10, '') 
EXEC sp_executesql @dsql 
END 

EXEC [dbo].[GetStockDeatils] 

SELECT * 
FROM dbo.v_Results 
+0

嘿非常感謝您的回覆。我試過這種方法。它的工作正常,但是當我嘗試執行SELECT * FROM dbo。#結果語句時,它顯示「無效的對象名稱#Results'」。我想這不是創建一個表。但如果它不創建表,那麼插入語句是如何正確工作的。你有沒有解決辦法? – user2045931

+0

有沒有什麼辦法可以用這種方法創建一個視圖,而不是創建一個表。其實我想結合我的invm表中的數據和一些來自不同表的數據,這些表的名字出現在invm表的一列中。 – user2045931

+0

SELECT語句包含在存儲過程的主體中。要執行過程需要EXEC命令。我更新我的回答 –

相關問題