在 UDF 中使用游标,返回具有不同表名称的列
Posted
技术标签:
【中文标题】在 UDF 中使用游标,返回具有不同表名称的列【英文标题】:Using cursor within UDF, returns a column which has name of different table 【发布时间】:2013-02-06 07:54:27 【问题描述】: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 =@PKKey
END
FETCH StockCursor INTO @tableName ,@PKKey
close StockCursor
DEALLOCATE StockCursor
Return
END
我已经写了这个,但它不能正常工作。 @tableName
包含表的名称。如果可能,请帮助我。
【问题讨论】:
这是一个非常非关系型的数据设计。这会给你带来很多像这样的问题。 【参考方案1】:听起来您需要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
【讨论】:
嘿,非常感谢您的回复。我试过这个方法。它工作正常,但是当我尝试执行 SELECT * FROM dbo.#Results 语句时,它显示“无效的对象名称'#Results'”。我想它不是在创建一个表。但如果它没有创建表,那么插入语句如何正常工作。你有什么解决办法吗? 有没有什么办法可以使用这种方法创建视图而不是创建表。实际上,我想将我的 invm 表中存在的数据和来自不同表的一些数据组合在一起,它们的名称存在于 invm 表的列中。 SELECT 语句包含在存储过程的主体中。执行程序需要 EXEC 命令。我更新我的答案 非常感谢您,先生。我真的很感谢你的帮助。非常感谢。我有另一个问题。我可以创建视图而不是创建表吗?为了性能?有可能吗? 创建没有存储过程的视图?以上是关于在 UDF 中使用游标,返回具有不同表名称的列的主要内容,如果未能解决你的问题,请参考以下文章