如何在 SQL 服务器中动态查询属性?
How can I query properties dynamically in SQL Server?
我目前正在做一个项目,其中包括一个自动炫耀部分。
基本上是做什么的:
- 我有一个名为 Fox 的 table,其中包含各种栏目。还有一些其他 tables 指的是 Fox(即 CaughtChickens)。
- 我想要另一个 table,我可以随时扩展,在我的脑海中有 3 列(除了 ID ofc.)FlairName,FlairColor 和 FlairStoredProcedure.
- 我想要一个 return 全部 FlairName 的存储过程,其中 FlairStoredProcedure returns 1、对于某个FoxID.
这样我就可以编写一个存储过程来检查某个 Fox 是否抓到了一只鸡,如果抓到了 returns 1,并在 Hunter 上添加天赋用户 UI.
这有一些缺点:
- 每次我想要新的天赋时,我都必须编写一个新的存储过程(是的,我不能把它删掉)。
- 存储过程需要有相同数量的输入参数(即@FoxID),并且需要return1或0(或select false 时什么都没有,select 如果是 true (?))
- 我需要在收集这些技巧的存储过程中使用 dynamicSQL,我有点不想使用任何 dynamicSQL。
难道没有我所缺少的更简单的方法吗?
EDIT:
示例:
我有一只table狐狸:
FoxID FoxName FoxColor FoxSize Valid
1 Swiper red 12 1
我会有一个table天赋
FlairID FlairName FlairStoredProcedure Valid
1 Big pFlairs_IsFoxBig 1
2 Green pFlairs_IsFoxGreen 1
我会有 3 个存储过程:
pFox_Flairs
@FoxID int
DECLARE @CurrentFlairSP as varchar(100)
DECLARE @CurrentIDIndex as varchar(100) = 1
DECLARE @ResultFlairs as table(FlairName as varchar(50), FlairColor as integer)
WHILE @CurrentIDIndex <= (SELECT MAX(ID) FROM Flairs WHERE Valid <> 0)
BEGIN
IF EXISTS(SELECT * FROM Flairs WHERE ID = @CurrentIDIndex AND VALID <> 0)
BEGIN
SET @CurrentFlairSP = CONCAT((SELECT TOP 1 FlairStoredProcedure FROM Flairs WHERE ID = @CurrentIDIndex AND VALID <> 0), ' @FoxID=@FoxID')
INSERT INTO @ResultFlairs
EXEC (@CurrentFlairSP)
END
@CurrentIDIndex += 1
END
SELECT * FROM @ResultFlairs
pFlairs_IsFoxBig
@FoxID int
SELECT 'Big' WHERE EXISTS( SELECT TOP 1 * FROM Fox WHERE ID = @Fox AND FoxSize > 10)
pFlairs_IsFoxGreen
@FoxID int
SELECT 'Green' WHERE EXISTS( SELECT TOP 1 * FROM Fox WHERE ID = @Fox AND FoxColor = 'green')
您可以创建一个 table 值函数来检查所有条件:
CREATE OR ALTER FUNCTION dbo.GetFlairs ( @FoxID int )
RETURNS TABLE
AS RETURN
SELECT v.FlairName
FROM Fox f
CROSS APPLY (
SELECT 'Big'
WHERE f.FoxSize > 10
UNION ALL
SELECT 'Green'
WHERE f.FoxColor = 'green'
) v(FlairName)
WHERE f.FoxID = @FoxID;
go
那么你可以这样使用它:
SELECT *
FROM dbo.GetFlairs(123);
如果或当您添加更多属性或条件时,只需将它们作为另一个添加到函数中即可 UNION ALL
我目前正在做一个项目,其中包括一个自动炫耀部分。
基本上是做什么的:
- 我有一个名为 Fox 的 table,其中包含各种栏目。还有一些其他 tables 指的是 Fox(即 CaughtChickens)。
- 我想要另一个 table,我可以随时扩展,在我的脑海中有 3 列(除了 ID ofc.)FlairName,FlairColor 和 FlairStoredProcedure.
- 我想要一个 return 全部 FlairName 的存储过程,其中 FlairStoredProcedure returns 1、对于某个FoxID.
这样我就可以编写一个存储过程来检查某个 Fox 是否抓到了一只鸡,如果抓到了 returns 1,并在 Hunter 上添加天赋用户 UI.
这有一些缺点:
- 每次我想要新的天赋时,我都必须编写一个新的存储过程(是的,我不能把它删掉)。
- 存储过程需要有相同数量的输入参数(即@FoxID),并且需要return1或0(或select false 时什么都没有,select 如果是 true (?))
- 我需要在收集这些技巧的存储过程中使用 dynamicSQL,我有点不想使用任何 dynamicSQL。
难道没有我所缺少的更简单的方法吗?
EDIT:
示例:
我有一只table狐狸:
FoxID FoxName FoxColor FoxSize Valid
1 Swiper red 12 1
我会有一个table天赋
FlairID FlairName FlairStoredProcedure Valid
1 Big pFlairs_IsFoxBig 1
2 Green pFlairs_IsFoxGreen 1
我会有 3 个存储过程:
pFox_Flairs
@FoxID int
DECLARE @CurrentFlairSP as varchar(100)
DECLARE @CurrentIDIndex as varchar(100) = 1
DECLARE @ResultFlairs as table(FlairName as varchar(50), FlairColor as integer)
WHILE @CurrentIDIndex <= (SELECT MAX(ID) FROM Flairs WHERE Valid <> 0)
BEGIN
IF EXISTS(SELECT * FROM Flairs WHERE ID = @CurrentIDIndex AND VALID <> 0)
BEGIN
SET @CurrentFlairSP = CONCAT((SELECT TOP 1 FlairStoredProcedure FROM Flairs WHERE ID = @CurrentIDIndex AND VALID <> 0), ' @FoxID=@FoxID')
INSERT INTO @ResultFlairs
EXEC (@CurrentFlairSP)
END
@CurrentIDIndex += 1
END
SELECT * FROM @ResultFlairs
pFlairs_IsFoxBig
@FoxID int
SELECT 'Big' WHERE EXISTS( SELECT TOP 1 * FROM Fox WHERE ID = @Fox AND FoxSize > 10)
pFlairs_IsFoxGreen
@FoxID int
SELECT 'Green' WHERE EXISTS( SELECT TOP 1 * FROM Fox WHERE ID = @Fox AND FoxColor = 'green')
您可以创建一个 table 值函数来检查所有条件:
CREATE OR ALTER FUNCTION dbo.GetFlairs ( @FoxID int )
RETURNS TABLE
AS RETURN
SELECT v.FlairName
FROM Fox f
CROSS APPLY (
SELECT 'Big'
WHERE f.FoxSize > 10
UNION ALL
SELECT 'Green'
WHERE f.FoxColor = 'green'
) v(FlairName)
WHERE f.FoxID = @FoxID;
go
那么你可以这样使用它:
SELECT *
FROM dbo.GetFlairs(123);
如果或当您添加更多属性或条件时,只需将它们作为另一个添加到函数中即可 UNION ALL