我的表格包含以下字段Name,Age,Salary,Phone,DOB
。根据设置表,我只需要选择一些字段。例如,我在设置中说,只需要Name
和Phone
。我怎么能用存储过程来做呢?
编辑:
哪一个好。
.Visibility
属性隐藏或显示列答案 0 :(得分:2)
SQL是一种固定的列语言:无法“动态”添加或删除列
您需要使用动态SQL来构建SELECT语句,或使用IF语句来执行不同的语句。但是,您会打开缓存,安全性和注入问题。
就个人而言,我会忽略客户端代码中的列,并且具有简单,单一的高效SQL查询。 SQL Server和客户端之间的契约或API应该是静态的和可预测的。如果在SQL Server中应用了设置表,则客户端不知道要使用哪些列。如果您的客户确实知道,那么它可以忽略它们。
编辑后,选项2,种类。
但是在在页面中呈现之前,应该删除中的数据。
保持简单:不要尝试优化任何尚未
答案 1 :(得分:2)
您需要在存储过程中根据设置表选择多个不同的选项,以返回不同的数据集。
CREATE PROCEDURE dbo.YourProcedure(...)
AS BEGIN
DECLARE @Setting INT -- ?? whatever it is
SELECT @Setting = Choice FROM dbo.YourSettingsTable WHERE ....... ???
IF @Setting = 1
SELECT Name, Phone
FROM dbo.YourDataTable
ELSE
SELECT Name, Age, DOB, Phone, Salary
FROM dbo.YourDataTable
END
然而,使用这种方法有危险 - 因为存储过程可能会返回一组数据或另一组数据,您的SQL Server查询优化器可能会对如何访问一个设置的数据作出非常好的决定 - 但是你的设置发生变化,执行计划将完全过时,从而可能导致可怕的表现......
另一方面 - 可能更容易确定在调用存储过程之前设置 - 然后将该设置作为存储过程参数传递。
甚至更好:为每个“场景”分别存储过程 - 然后从调用者那里调用适当的存储过程,具体取决于你的设置值....
答案 2 :(得分:1)
动态创建你想要的sql然后用exec执行它。
declare @sql varchar(500)
set @sql = 'select 123'
exec (@sql)
上述代码可以帮助您了解您需要了解的内容。
答案 3 :(得分:0)