动态内联SQL查询不支持本地语言动态无法在本地语言列之前添加N

问题描述

表名:客户

customerID VARCHAR(20),CustomerName NVARCHAR(100)
City NVARCHAR(100)
Country NVARCHAR(100)

CustomerName,City,Country列将使用本地语言。

对于搜索功能,我们需要形成如下所示的动态查询

SELECT CostomerID 
FROM customer
 WHERE CITY=N'New York'

所以在SP中,我们有如下代码

SET Query= 'SELECT CostomerID FROM customer WHERE ' + @columnName + '=' + @Value

exec查询

问题在于,由于“城市列”使用的是本地语言,因此我们需要在值动态查询添加N前缀,但无法在动态查询添加N

示例代码

DECLARE @columnName NVARCHAR(200) SET @ columnName ='CITY'

预期 宣告@ Value1 NVARCHAR(200) SET @ Value1 = N'சென்னை' 打印(@ Value1) 声明@statement NVARCHAR(500) SET @ statement ='从客户所在位置选择CostomerID'+ @columnName +'= N'''+ @ Value1 +'''' 打印(@statement)

自动 宣告@ Value2 NVARCHAR(200) SET @ Value2 ='சென்னை' 打印(@ Value2) 声明@statement NVARCHAR(500) SET @ statement ='从客户所在位置选择CostomerID'+ @columnName +'= N'''+ @ Value2 +'''' 打印(@statement)

尝试过
宣告@ Value3 NVARCHAR(200) SET @ Value3 ='N'+'சென்னை' 打印(@ Value3) 声明@statement NVARCHAR(500) SET @ statement ='从客户所在位置选择CostomerID'+ @columnName +'= N'''+ @ Value3 +'''' 打印(@statement)

解决方法

在构建语句时,您不会做任何操作来在应该作为查找值的字符串文字周围加上引号。 您没有说您实际得到了什么,但我希望它是这样的:

SELECT 1 FROM customer WHERE City=Nசென்னை

如果您希望得到:

SELECT 1 FROM customer WHERE City=N'சென்னை'

您需要通过以下方式构建语句:

SET @statement= 'SELECT CostomerID FROM customer WHERE ' + @columnName + '=N'''  + @Value + ''

如果@Value恰好包含单引号,则此操作将失败。更好的方法是定义一个函数,该函数采用NTEXT值并返回字符串文字表示形式,该字符串文字表示形式带有前N个,周围的引号和所有内部引号加倍(以及我忘记的其他内容)。