Sql 在UDF中使用游标,返回具有不同表名的列
我已经写了这个,但它不能正常工作@tableName包含表的名称。如果可能,请帮助我。听起来您需要一个,但是您不能从函数中使用动态SQL。为此,必须创建存储过程Sql 在UDF中使用游标,返回具有不同表名的列,sql,sql-server-2005,cursor,user-defined-functions,Sql,Sql Server 2005,Cursor,User Defined Functions,我已经写了这个,但它不能正常工作@tableName包含表的名称。如果可能,请帮助我。听起来您需要一个,但是您不能从函数中使用动态SQL。为此,必须创建存储过程 Create FUNCTION [dbo].[fn_GetStockDeatils]() RETURNS @Results TABLE ( PurchaseData nvarchar(50) NOT NULL ) AS BEGIN Declare @tableName varchar(25) Declar
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
演示
创建视图的过程
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]
听起来您需要一个,但不能从函数中使用动态SQL。为此,必须创建存储过程
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
演示
创建视图的过程
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]
嘿,非常感谢你的回复。我试过这个方法。它工作正常,但当我尝试从dbo.Results语句执行SELECT*时,它向我显示了无效的对象名“Results”。我猜这不是在创建表。但是,如果它没有创建表,那么insert语句是如何正常工作的呢。你有什么解决办法吗?有没有办法用这个方法创建一个视图而不是创建一个表。实际上,我想将invm表中的数据和来自不同表的一些数据结合起来,这些数据的名称出现在invm表的一列中。SELECT语句包含在存储过程的主体中。要执行该过程,需要EXEC命令。我更新了我的答案非常感谢你,先生。我真的很感谢你的帮助。非常感谢。我还有一个问题。我可以创建视图而不是创建表吗。为了表演?有可能吗?创建没有存储过程的视图?嘿,非常感谢你的回复。我试过这个方法。它工作正常,但当我尝试从dbo.Results语句执行SELECT*时,它向我显示了无效的对象名“Results”。我猜这不是在创建表。但是,如果它没有创建表,那么insert语句是如何正常工作的呢。你有什么解决办法吗?有没有办法用这个方法创建一个视图而不是创建一个表。实际上,我想将invm表中的数据和来自不同表的一些数据结合起来,这些数据的名称出现在invm表的一列中。SELECT语句包含在存储过程的主体中。要执行该过程,需要EXEC命令。我更新了我的答案非常感谢你,先生。我真的很感谢你的帮助。非常感谢。我还有一个问题。我可以创建视图而不是创建表吗。为了表演?是否可能?创建没有存储过程的视图?这是一个非常非关系数据设计。这将给您带来许多类似这样的问题。这是一个非常非关系型的数据设计。这会给你带来很多像这样的问题。