gpt4 book ai didi

sql - 将西里尔字符传递到存储过程中不起作用 Sql Server

转载 作者:行者123 更新时间:2023-12-02 00:08:28 25 4
gpt4 key购买 nike

我有存储过程

if OBJECT_ID(N'dbo.spGetProducts') is not null
drop procedure dbo.spGetProducts
go

CREATE procedure [dbo].[spGetProducts]
(
@sort_col varchar(100), @sort_dir varchar(4),
@start int, @num int, @filters nvarchar(2000)) as
begin
declare @end int
declare
@res table
(
row_num int,
product_name nvarchar(max)
)
set @end = @start+@num
insert into @res
EXEC
(
'select * from
(
select (ROW_NUMBER() OVER (ORDER BY '+@sort_col+' '+@sort_dir+')) row_num,
* FROM (select product_name from Products where '+@filters+') as x
) as tmp where row_num between '+@start+' and '+@end
) select row_num, product_name from @res
end
go

当我使用拉丁字符执行存储过程时,效果很好,但是当我使用西里尔字符时,不返回任何内容..

这是执行行:

  1. 拉丁字符 - 工作:

    exec dbo.spGetProducts 'product_name','desc',0,50,' 
    product_name like N''%abs%'''
  2. 西里尔字符 - 不工作:

    exec dbo.spGetProducts 'product_name','desc',0,50,' 
    product_name like N''%абв%'''

我也是手动设置存储过程使用

'product_name like N''%абв%'''

进线

select product_name from Products where '+@filters+'

 select product_name from Products where product_name like N''%абв%'''

而且这个工作,所以我不知道如何解决这个问题..

最佳答案

关于西里尔字母内部参数的问题,您只需要在发送时在整个过滤器参数前面再放一个 N

exec dbo.spGetProducts 'product_name','desc',0,50, N'product_name like N''%абв%'''
^
^
here

但也请阅读我关于安全问题的评论并重新考虑更改您的设计。

SQLFiddle Demo

编辑 - 一点解释:如果您没有指定您的输入参数是 NVARCHAR,它将被隐式声明为 VARCHAR,并且您的西里尔字母 абв 将丢失并替换为 ?? ? 在它们被传递给过程之前。

如果您从 C# 或 VB 传递参数,声明它们 DBType.NVarChar 应该足以避免该问题。

关于sql - 将西里尔字符传递到存储过程中不起作用 Sql Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16917771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com