Sql server SQL Server-存储过程问题
对于我正在处理的应用程序。。。我们正在创建一个自定义日志系统。用户可以查看日志并对其应用“标记”(就像您如何将标记应用于此处的问题!) 在这个例子中,我试图得到一个所有日志的列表,并给出一个“标记”。。。但这对我来说也是一个更好地学习存储过程的练习:) 我有一个类似这样的存储过程,用于通过PK选择日志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
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执行搜索或使用外部应用功能(效率不高) 内联表值函数基本上是参数化视图,优化器可以相当轻松地对其进行优化