我正在尝试将NVARCHAR
参数传递给我的商店程序。存储过程应该找到符合指定条件的所有供应商。我唯一的问题是我试图传递包含希伯来语的标准。
ALTER PROCEDURE [dbo].[FindSupplier]
-- Add the parameters for the stored procedure here
@search_criteria nvarchar(100) = ''
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @hebrew as bit = 0
IF @search_criteria LIKE '%[אבגדהוזחטיחכךילמנפףערקשת]%'
BEGIN
SET @hebrew = 1
END
IF @hebrew = 0
BEGIN
SELECT comn020.t_suno 'Supplier Code'
, hebcom020.t_nama 'Supplier Name1'
, hebcom020.t_namb 'Supplier Name2'
FROM com020 WITH (NOLOCK)
INNER JOIN hebcom020 WITH (NOLOCK)
ON hebcom020.t_suno = com020.t_suno
WHERE (LTRIM(RTRIM(com020.t_suno)) LIKE N'%' + @search_criteria + '%')
OR (SOUNDEX(LTRIM(RTRIM(com020.t_suno))) LIKE N'%' + SOUNDEX(@search_criteria) + '%')
OR (LTRIM(RTRIM(hebcom020.t_nama)) LIKE N'%' + @search_criteria + '%')
OR (SOUNDEX(LTRIM(RTRIM(hebcom020.t_nama))) LIKE N'%' + SOUNDEX(@search_criteria) + '%')
OR (LTRIM(RTRIM(hebcom020.t_namb)) LIKE N'%' + @search_criteria + '%')
OR (SOUNDEX(LTRIM(RTRIM(hebcom020.t_namb))) LIKE N'%' + SOUNDEX(@search_criteria) + '%')
END
ELSE /* hebrew */
BEGIN
SELECT com020.t_suno 'Supplier Code'
, hebcom020.t_nama 'Supplier Name1'
, hebcom020.t_namb 'Supplier Name2'
FROM com020 WITH (NOLOCK)
INNER hebcom020 WITH (NOLOCK)
ON hebcom020.t_suno = com020.t_suno
WHERE hebcom020.t_nama Collate Hebrew_CI_AI LIKE N'%' + @search_criteria + '%' Collate Hebrew_CI_AI
OR (LTRIM(RTRIM(hebcom020.t_namb)) LIKE N'%' + @search_criteria + '%')
END
END
当我尝试传递exec FindSupplier 'ב'
之类的内容时,SQL服务器会将char'ב'识别为'?'
我们非常感谢您的帮助
UPD:exec FindSupplier N'ב'
工作
UPD2:在Visual Studio中需要使用以下字符串
运行sp="exec FindSupplier N'" & Parameters!search_criteria.Value & "'"
答案 0 :(得分:2)
问题很简单,LIKE
条件中使用的字符串文字不前缀为N
,表示它是Unicode字符串。以下示例显示了差异:
DECLARE @search_criteria NVARCHAR(100) = N'ב';
IF @search_criteria LIKE '%[אבגדהוזחטיחכךילמנפףערקשת]%'
BEGIN
PRINT 'WithOUT "N"-prefix';
END;
IF @search_criteria LIKE N'%[אבגדהוזחטיחכךילמנפףערקשת]%'
BEGIN
PRINT 'WITH "N"-prefix';
END;
返回:
WITH "N"-prefix
为了更容易理解为什么行为存在差异,请考虑以下因素:
-- when the DB has a default collation of Latin1_General_100_CI_AS_SC (code page 1252)
SELECT '%[אבגדהוזחטיחכךילמנפףערקשת]%'
-- %[????????????????????????]%
-- when the DB has a default collation of Hebrew_100_CI_AS_SC (code page 1255)
SELECT '%[אבגדהוזחטיחכךילמנפףערקשת]%'
-- %[אבגדהוזחטיחכךילמנפףערקשת]%
在当前数据库的默认排序规则所使用的代码页中解析字符串文字。如果代码页可以支持这些字符,那么不要在大写字母前加上" N"将工作。但是,如果那些代码页中不存在这些字符,那么它们就会被转换为"?" s。