使用存储过程对 table 进行分组
Using stored procedures to group a table
UPDATE - 我已经弄清楚如何使用代码优先迁移来添加存储过程。 'All' 我现在想知道如何应用 SELECT * FROM _tempTable1_ UNION SELECT * FROM _tempTable2
,然后输出它。我正在考虑实施执行此操作的第三个存储过程,但我不确定这是否是正确的做法?非常感谢帮助:)
我有一个 table 连接到我的 ASP.NET MVC 应用程序,并且我在 SQL 服务器中创建了两个存储过程。是否可以通过某种方式实现这些存储过程,以便在输出table时,可以将其分组到这些存储过程中?
MetBasicCriteria
ALTER PROCEDURE [dbo].[MetBasicCriteria]
-- Add the parameters for the stored procedure here
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 *
FROM dbo.Applications
WHERE NorwegianCitizen=1
AND CurrentlyInUni=1
AND Norwegian=1
AND English=1
END
MetMoreCriteria
ALTER PROCEDURE [dbo].[MetMoreCriteria]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
--EXEC [dbo.MetBasicCriteria]
SELECT *
FROM dbo.Applications
WHERE (Dutch=1
OR OtherCitizenships='Dutch'
OR (Course_bachelor='Political Science' OR Course_bachelor='Economy' OR Course_bachelor='International Relations')
OR (Grade_Bachelor='a' OR Grade_Bachelor='A' OR Grade_Bachelor='b' OR Grade_Bachelor='B'))
--AND MetBasicCriteria=1
END
换句话说 --> 我可以使用 3 个不同的存储过程,将这 3 个的结果保存到不同的临时 tables ,并使用 UNION ALL
将它们组合成 1 个临时 table?
提前致谢
我只是把你的第二个程序代码修改为一个简单的 POC。我不知道您打算如何将第一个程序的结果集与第二个程序的结果集合并、更改或合并。所以我把它留给你。我还将删除您在代码中留下的无意义注释,因为您似乎在使用某种模板。
ALTER PROCEDURE [dbo].[MetMoreCriteria]
AS
BEGIN
SET NOCOUNT ON;
create table #basic (
id int not null,
...
);
Insert #basic (id) --column list to be defined
EXEC [dbo.MetBasicCriteria];
SELECT appl.id, ...
FROM dbo.Applications as appl
WHERE (appl.Dutch=1
OR appl.OtherCitizenships='Dutch'
OR (appl.Course_bachelor in ('Political Science', 'Economy', 'International Relations'))
OR (appl.Grade_Bachelor in ('A', 'a', 'B', 'b'))
)
AND EXISTS (SELECT * FROM #basic as basic where basic.id = appl.id)
ORDER BY ...;
END
希望我正确使用了括号,但我无法对其进行测试,并且此编辑小部件不会自动计数或更正拼写错误或错误。一些更好的编码点:
- 为每个 table 定义一个别名,并将其用于每个列引用。
- 一般不要使用“*”作为列列表
- 使用 IN 而不是一系列逻辑或比较使您的代码更具可读性并且更不容易出错
SELECT 和 INSERT 语句中的列列表应该是特定的 - 不要对 select 所有列使用惰性星号,因为您通常不需要它们。如果确实需要它们,请指定每一列以避免将来 table 的架构发生变化时出现问题。 “*”作为列列表的唯一位置是在 EXISTS 子句中。
我还添加了 ORDER BY 子句,因为结果集的使用者通常希望对这些行进行排序。但也许你的 application/consumer 不在乎?如果是这样,请将其删除并节省一些处理器周期。
最后这只是一种方法。您还可以将第一个过程设为视图或 UDF,因为它不会做任何复杂的事情。该评论也适用于此程序。也许您只是将一组相当简单的逻辑过于复杂化了?注意,我省略了任何错误处理并将其留给您。让我重申这不是建议。只是一个实施选项。
UPDATE - 我已经弄清楚如何使用代码优先迁移来添加存储过程。 'All' 我现在想知道如何应用 SELECT * FROM _tempTable1_ UNION SELECT * FROM _tempTable2
,然后输出它。我正在考虑实施执行此操作的第三个存储过程,但我不确定这是否是正确的做法?非常感谢帮助:)
我有一个 table 连接到我的 ASP.NET MVC 应用程序,并且我在 SQL 服务器中创建了两个存储过程。是否可以通过某种方式实现这些存储过程,以便在输出table时,可以将其分组到这些存储过程中?
MetBasicCriteria
ALTER PROCEDURE [dbo].[MetBasicCriteria]
-- Add the parameters for the stored procedure here
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 *
FROM dbo.Applications
WHERE NorwegianCitizen=1
AND CurrentlyInUni=1
AND Norwegian=1
AND English=1
END
MetMoreCriteria
ALTER PROCEDURE [dbo].[MetMoreCriteria]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
--EXEC [dbo.MetBasicCriteria]
SELECT *
FROM dbo.Applications
WHERE (Dutch=1
OR OtherCitizenships='Dutch'
OR (Course_bachelor='Political Science' OR Course_bachelor='Economy' OR Course_bachelor='International Relations')
OR (Grade_Bachelor='a' OR Grade_Bachelor='A' OR Grade_Bachelor='b' OR Grade_Bachelor='B'))
--AND MetBasicCriteria=1
END
换句话说 --> 我可以使用 3 个不同的存储过程,将这 3 个的结果保存到不同的临时 tables ,并使用 UNION ALL
将它们组合成 1 个临时 table?
提前致谢
我只是把你的第二个程序代码修改为一个简单的 POC。我不知道您打算如何将第一个程序的结果集与第二个程序的结果集合并、更改或合并。所以我把它留给你。我还将删除您在代码中留下的无意义注释,因为您似乎在使用某种模板。
ALTER PROCEDURE [dbo].[MetMoreCriteria]
AS
BEGIN
SET NOCOUNT ON;
create table #basic (
id int not null,
...
);
Insert #basic (id) --column list to be defined
EXEC [dbo.MetBasicCriteria];
SELECT appl.id, ...
FROM dbo.Applications as appl
WHERE (appl.Dutch=1
OR appl.OtherCitizenships='Dutch'
OR (appl.Course_bachelor in ('Political Science', 'Economy', 'International Relations'))
OR (appl.Grade_Bachelor in ('A', 'a', 'B', 'b'))
)
AND EXISTS (SELECT * FROM #basic as basic where basic.id = appl.id)
ORDER BY ...;
END
希望我正确使用了括号,但我无法对其进行测试,并且此编辑小部件不会自动计数或更正拼写错误或错误。一些更好的编码点:
- 为每个 table 定义一个别名,并将其用于每个列引用。
- 一般不要使用“*”作为列列表
- 使用 IN 而不是一系列逻辑或比较使您的代码更具可读性并且更不容易出错
SELECT 和 INSERT 语句中的列列表应该是特定的 - 不要对 select 所有列使用惰性星号,因为您通常不需要它们。如果确实需要它们,请指定每一列以避免将来 table 的架构发生变化时出现问题。 “*”作为列列表的唯一位置是在 EXISTS 子句中。
我还添加了 ORDER BY 子句,因为结果集的使用者通常希望对这些行进行排序。但也许你的 application/consumer 不在乎?如果是这样,请将其删除并节省一些处理器周期。
最后这只是一种方法。您还可以将第一个过程设为视图或 UDF,因为它不会做任何复杂的事情。该评论也适用于此程序。也许您只是将一组相当简单的逻辑过于复杂化了?注意,我省略了任何错误处理并将其留给您。让我重申这不是建议。只是一个实施选项。