Sql server SQL Server-存储过程问题

Sql server SQL Server-存储过程问题,sql-server,stored-procedures,Sql Server,Stored Procedures,对于我正在处理的应用程序。。。我们正在创建一个自定义日志系统。用户可以查看日志并对其应用“标记”(就像您如何将标记应用于此处的问题!) 在这个例子中,我试图得到一个所有日志的列表,并给出一个“标记”。。。但这对我来说也是一个更好地学习存储过程的练习:) 我有一个类似这样的存储过程,用于通过PK选择日志 ALTER PROCEDURE [dbo].[getLogByLogId] -- Add the parameters for the stored procedure here

对于我正在处理的应用程序。。。我们正在创建一个自定义日志系统。用户可以查看日志并对其应用“标记”(就像您如何将标记应用于此处的问题!)

在这个例子中,我试图得到一个所有日志的列表,并给出一个“标记”。。。但这对我来说也是一个更好地学习存储过程的练习:)

我有一个类似这样的存储过程,用于通过PK选择日志

ALTER PROCEDURE [dbo].[getLogByLogId] 
    -- Add the parameters for the stored procedure here
    @ID int

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT  TOP 1

    LOG_ID,
    a.A,
    a.B,
    a.C

    FROM dbo.LOG a
    WHERE a.LOG_ID = @ID
现在我想从另一个调用此存储过程。。。像这样的

ALTER PROCEDURE [dbo].[getLogsByTagName] 
        -- Add the parameters for the stored procedure here
        @TAG nvarchar(50)

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT  TOP 1000

    LOG_ID --somehow store this and execute the dbo.getLogByLogId procedure here

    FROM dbo.LOG_TAG a
    WHERE a.TAG = @TAG
DECLARE @Table TABLE(
        ID INT
)

INSERT INTO @Table SELECT 1
INSERT INTO @Table SELECT 2
INSERT INTO @Table SELECT 3
INSERT INTO @Table SELECT 4
INSERT INTO @Table SELECT 5
INSERT INTO @Table SELECT 6


DECLARE Cur CURSOR FOR 
SELECT ID
FROM @Table

OPEN Cur

DECLARE @ID INT
FETCH NEXT FROM Cur INTO @ID

WHILE @@FETCH_STATUS = 0 
BEGIN
    PRINT @ID
    FETCH NEXT FROM Cur INTO @ID
END

CLOSE Cur
DEALLOCATE Cur

谢谢

如果要从存储过程中调用另一个存储过程,请使用:

CREATE PROCEDURE myTestProc
AS
BEGIN

--Do some work in this procedure
SELECT blah FROM foo

--now call another sproc
EXEC nameOfSecondSproc
END

你能达到你正在尝试的目标的唯一方法是使用

如果这只是为了你的学习,那么无论如何,试试看,但我不建议将其用于生产

会是这样的

ALTER PROCEDURE [dbo].[getLogsByTagName] 
        -- Add the parameters for the stored procedure here
        @TAG nvarchar(50)

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT  TOP 1000

    LOG_ID --somehow store this and execute the dbo.getLogByLogId procedure here

    FROM dbo.LOG_TAG a
    WHERE a.TAG = @TAG
DECLARE @Table TABLE(
        ID INT
)

INSERT INTO @Table SELECT 1
INSERT INTO @Table SELECT 2
INSERT INTO @Table SELECT 3
INSERT INTO @Table SELECT 4
INSERT INTO @Table SELECT 5
INSERT INTO @Table SELECT 6


DECLARE Cur CURSOR FOR 
SELECT ID
FROM @Table

OPEN Cur

DECLARE @ID INT
FETCH NEXT FROM Cur INTO @ID

WHILE @@FETCH_STATUS = 0 
BEGIN
    PRINT @ID
    FETCH NEXT FROM Cur INTO @ID
END

CLOSE Cur
DEALLOCATE Cur
通过使用WHILE循环中检索到的@ID,您可以执行所需的sp,并将值插入到表变量中


可以使用以下语法从另一个存储过程调用存储过程:

    ALTER PROCEDURE [dbo].[getLogsByTagName]  
            -- Add the parameters for the stored procedure here 
            @TAG nvarchar(50) 

    AS 
    BEGIN 
        -- SET NOCOUNT ON added to prevent extra result sets from 
        -- interfering with SELECT statements. 
        SET NOCOUNT ON; 

        -- Insert statements for procedure here 
        SELECT  TOP 1000 

        LOG_ID --somehow store this and execute the dbo.getLogByLogId procedure here 

        FROM dbo.LOG_TAG a 
        WHERE a.TAG = @TAG 

        -- Execute dbo.getLogByLogId stored procedure
    DECLARE @logId INTEGER
    SET @logId = <some value>
    EXEC dbo.getLogByLogId @logId
END
如果您担心多次返回相同的logId,那么可以在SELECT语句中使用DISTINCT关键字来过滤重复的logId

您还可以将dbo.getLogByLogId过程重写为用户定义函数(UDF)。UDF可以接受表作为参数并返回表结果


有关用户定义函数的介绍,请参见。

如果您的logbyid SP中有复杂的逻辑,并且您试图避免在系统中的多个位置(列、派生列等的选择)复制这些逻辑,我建议您将其改为内联表值函数(可能不使用ID参数,在这种情况下,您实际上可以使用普通视图)

然后,您可以加入到其他存储过程中的ITVF/视图(或者创建另一个udf),该udf执行搜索或使用外部应用功能(效率不高)

内联表值函数基本上是参数化视图,优化器可以相当轻松地对其进行优化