我必须在一列中插入俄语字符。
它可以通过以下方式完成:
insert into tbl_test(name)
values(N'ŞİĞİL')
没错,但我必须在 SP 中做一些@pName
参数。
所以,
insert into tbl_test(name)
values(N@pName)
不是正确的语法。
有什么方法可以使用代码或在选项中有选项吗?
谢谢。
我必须在一列中插入俄语字符。
它可以通过以下方式完成:
insert into tbl_test(name)
values(N'ŞİĞİL')
没错,但我必须在 SP 中做一些@pName
参数。
所以,
insert into tbl_test(name)
values(N@pName)
不是正确的语法。
有什么方法可以使用代码或在选项中有选项吗?
谢谢。
使用 nvarchar (unicode string) 作为参数类型应该可以解决问题:
create procedure dbo.spAddName
@name nvarchar(100)
as
insert into tbl_test(name) values(@name)
GO
更新
显然,问题似乎出在您的调用代码中,而不是其他人试图帮助解决的存储过程的定义中。
这是一个完整示例,说明如何从 t-sql 和 c# 正确调用上述存储过程。
-- create a test table
create table dbo.tbl_test (
name nvarchar(100) NOT NULL
)
go
-- prove that a simple insert succeeds
insert into dbo.tbl_test (name) values (N'ŞİĞİL')
-- simple select against the unicode column to return the characters verbatim
select name from dbo.tbl_test
-- execute the original stored procedure from t-sql
dbo.spAddName N'ŞİĞİL'
...现在使用 c# 和 ado.net,只是为了提供来自应用程序代码的示例调用。
const string cnStr = @"Server=.;Database=test;Trusted_Connection=Yes;";
using (SqlConnection cn = new SqlConnection(cnStr)) {
cn.Open();
using (SqlCommand cmd = new SqlCommand("dbo.spAddName", cn)) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 100) {
Value = "ŞİĞİL"
});
cmd.ExecuteNonQuery();
}
cn.Close();
}
如果您对那些试图提供帮助的人更有礼貌,那么将来您更有可能获得更多帮助。
祝你好运!
我有同样的问题。这个解决方案对我有用:http ://www.dbafire.com/2015/06/21/convert-varchar-column-to-nvarchar-techniques-and-best-practices/
我意识到了问题,必须更改参数值的排序规则。试试那几行,一步一步。
ALTER DATABASE TEST SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE TEST COLLATE Cyrillic_General_100_CI_AS
ALTER DATABASE TEST SET MULTI_USER
但是,如果数据库中有依赖项,
ALTER DATABASE TEST COLLATE Cyrillic_General_100_CI_AS
不管用。您必须删除依赖项,然后尝试。
谢谢。