Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在UDF中使用游标,返回具有不同表名的列_Sql_Sql Server 2005_Cursor_User Defined Functions - Fatal编程技术网

Sql 在UDF中使用游标,返回具有不同表名的列

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

我已经写了这个,但它不能正常工作@tableName包含表的名称。如果可能,请帮助我。

听起来您需要一个,但是您不能从函数中使用动态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]
听起来您需要一个,但不能从函数中使用动态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命令。我更新了我的答案非常感谢你,先生。我真的很感谢你的帮助。非常感谢。我还有一个问题。我可以创建视图而不是创建表吗。为了表演?是否可能?创建没有存储过程的视图?这是一个非常非关系数据设计。这将给您带来许多类似这样的问题。这是一个非常非关系型的数据设计。这会给你带来很多像这样的问题。