问题描述
表名:客户
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个,周围的引号和所有内部引号加倍(以及我忘记的其他内容)。