如何根据C#

时间:2019-03-25 17:08:26

标签: c# sql-server

我被困在试图找到解决方案,也许有人可以帮忙?

基于从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#

有人告诉我这是不安全的,并找到其他方法。

2 个答案:

答案 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