我被困在试图找到解决方案,也许有人可以帮忙?
基于从C#发送的int参数,我们的查询中使用的参数应该更改。伪代码:
DECLARE @parameterFromC# int = 1
DECLARE @city1 nvarchar = 'London'
DECLARE @city2 nvarchar = 'Paris'
DECLARE @city3 nvarchar = 'New York'
DECLARE @mainParameter nvarchar
SELECT * from Customers
WHERE City = @mainParameter
当@ parameterFromC#为1时,@ mainParameter应该为= @ city1,
当@ parameterFromC#为2时,@ mainParameter应为= @ city2等
我的解决方案是使@ parameterFromC#nvarchar,将数字作为字符串发送,然后将其与'@city'连接。用伪代码是这样的:
@mainParameter ='@city'+ @parameterFromC#
有人告诉我这是不安全的,并找到其他方法。
答案 0 :(得分:2)
我同意Larnu-我认为您应该通过C#进入城市,但是我不知道您的情况。您应该可以使用CASE/WHEN
。
SET @mainParameter=CASE
WHEN @parameterFromC=1 THEN @city1
WHEN @parameterFromC=2 THEN @city2
ELSE @city3
END
在声明变量之后并且在Customers table
上进行选择之前,请使用此行。
您不一定需要@mainParameter
。您可以在where子句中使用CASE/WHEN
。
SELECT *
FROM Customers
WHERE City = CASE
WHEN @parameterFromC=1 THEN @city1
WHEN @parameterFromC=2 THEN @city2
ELSE @city3
END
答案 1 :(得分:2)
另一种也许更易读的方法可能是将确定sql参数值的逻辑与sql参数的实际用法分开。很有可能没有性能提高或降低,sql编译器非常聪明。
DECLARE @parameterFromC int = 1
DECLARE @city1 nvarchar = 'London'
DECLARE @city2 nvarchar = 'Paris'
DECLARE @city3 nvarchar = 'New York'
DECLARE @mainParameter nvarchar
SET @mainParameter = CASE
WHEN @parameterFromC = 1 THEN @city1
WHEN @parameterFromC = 2 THEN @city2
ELSE @city3
END
SELECT * from Customers
WHERE City = @mainParameter