我正在尝试创建一个具有3个参数的存储过程。另一个软件会使用参数调用我的过程,以便查询一堆记录。
存储过程仅包含一个select
语句,并根据参数对where
子句进行过滤。
如何将这些记录返回给“呼叫者”?
我试图将这些记录插入到临时表中,如下所示:
create procedure xxx
drop table table_temp
select * into table_temp from table where parameters
问题是,如果两个用户同时调用存储过程,他们将得到混淆的结果。
任何对此困境的建议都将受到高度赞赏。
答案 0 :(得分:0)
您可以使用上述临时表,也可以使用表类型(对于这些示例,我使用AdventureWorks2014演示数据库):
CREATE PROCEDURE TableVariableDemo(
@Color nvarchar(15),
@Size nvarchar(5))
AS
BEGIN
DECLARE @Results TABLE(ProductID int, [Name] nvarchar(255), ProductNumber nvarchar(25), Color nvarchar(15), Size nvarchar(5))
INSERT INTO @Results (ProductID, [Name], ProductNumber, Color, Size)
SELECT
ProductID,
[Name],
ProductNumber,
Color,
Size
FROM
Production.Product
WHERE
Color = @Color AND
Size = @Size
SELECT
ProductID,
[Name],
ProductNumber,
Color,
Size
FROM
@Results
END
当您期望没有太多的行返回时,该解决方案很好。当您期望查询返回很多行时,使用临时表可能会更好。与使用临时表相同:
CREATE PROCEDURE TempTableDemo(
@Color nvarchar(15),
@Size nvarchar(5))
AS
BEGIN
CREATE TABLE #Results(ProductID int, [Name] nvarchar(255), ProductNumber nvarchar(25), Color nvarchar(15), Size nvarchar(5))
INSERT INTO #Results (ProductID, [Name], ProductNumber, Color, Size)
SELECT
ProductID,
[Name],
ProductNumber,
Color,
Size
FROM
Production.Product
WHERE
Color = @Color AND
Size = @Size
SELECT
ProductID,
[Name],
ProductNumber,
Color,
Size
FROM
#Results
DROP TABLE #Results
END
但是我不知道为什么你不使用这样的东西:
CREATE PROCEDURE SelectDemo(
@Color nvarchar(15),
@Size nvarchar(5))
AS
BEGIN
SELECT
ProductID,
[Name],
ProductNumber,
Color,
Size
FROM
Production.Product
WHERE
Color = @Color AND
Size = @Size
END
最良好的祝愿
迈克尔