SQL在带变量的存储过程中使用Unicode N

SQL use Unicode N in a Stored Procedure with variable

我具有以下存储过程,我正在寻找正确的语法,因此我可以在"注释"列中播放"注释"值,前端应使用N表示Unicode值,我需要保存俄语字符值

因此,目前正在像这样传递注释值

@评论

我想做

N @条评论,但不起作用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
ALTER PROCEDURE [dbo].[spInsertContactUs]
(
@title VARCHAR(20) = DEFAULT,
@forename VARCHAR(100) = DEFAULT,
@surname VARCHAR(100) = DEFAULT,
@gender VARCHAR(50) = DEFAULT,
@address1 VARCHAR(100) = DEFAULT,
@address2 VARCHAR(100) = DEFAULT,
@city VARCHAR(50) = DEFAULT,
@county VARCHAR(50) = DEFAULT,
@country INT = DEFAULT,
@zipcode VARCHAR(50) = DEFAULT,
@email VARCHAR(200) = DEFAULT,
@comments NVARCHAR(MAX) = DEFAULT,
@mailinglist BIT = DEFAULT,
@address3 VARCHAR(100) = DEFAULT,
@dateOfBirth datetime = DEFAULT
)
AS
SET NOCOUNT ON

INSERT INTO tblContactUs (
dateAdded,
title,
forename,
surname,
gender,
address1,
address2,
city,
county,
country,
zipcode,
email,
comments,
mailinglist,
address3,
dateOfBirth)
VALUES (
getdate(),
@title,
@forename,
@surname,
@gender,
@address1,
@address2,
@city,
@county,
@country,
@zipcode,
@email,
@comments,
@mailinglist,
@address3,
@dateOfBirth
)

SET NOCOUNT OFF
RETURN

;

  • 顺便说一句,在SQL Server中用" sp *** "来命名存储过程是一个坏主意,因为查询分析器总是具有系统命名约定的情况下会搜索系统存储的proc。
  • @JNK具有此行为的是sp_而不是sp
  • @Martin-我以为只用了SP ...但是对了!
  • 好吧,反正知道!
  • 我已经更新了我的答案。 stackoverflow.com/questions/1856239/…


在表的字段和存储的procs参数中使用Nvarchar数据类型。

已添加

查看此链接,也许这会对您有所帮助。

  • 嘿,伊戈尔,是的,正如您在上面的存储过程中所见,我是@comments NVARCHAR(MAX)= default但没有喜悦
  • 表格中的字段呢?
  • 是的,我将其更改为NVARCHAR(MAX)
  • 因此,您说的是当我使用NVARCHAR时,在插入数据库时??无需在值之前先查看add N
  • @StevieB-N会以unicode格式在单引号中加上任何后缀。
  • @StevieB您如何称呼此存储过程?
  • @JNK是的,我想我虽然在存储过程中也需要它,因为我在保存俄语字符时遇到问题,即如果我执行普通的sql UPDATE tblContactUs SET注释= N \\'Админ\\'WHERE(id = 2228),它可以很好地保存并且我试图在具有变量的存储过程中获得相同的逻辑,但证明是不可能的
  • 类中的@igor ASP Dim注释\\\\ t \\\\ t:注释\\\\ t \\\\ t = database_FilterInput(request.Form(" comments "))设置objSP = SQLGetProcedure(" spInsertContactUs ")... SQLSetProcedureParam objSP,"评论",注释...
  • 什么是SQLSetProcedureParam?为此,我看不到很多Google搜索结果。也许使用SQL事件探查器来查看您的ASP应用程序正在发送到服务器的内容。
  • 抱歉,它是一种客户方法。但是,当我在存储过程中将注释的值打印到屏幕上时,该值是Админ。因此,我认为服务器上没有问题。我只需要找到一种方法使该变量前面有一个N
  • @StevieB我已将链接添加到我的答案。请看。我想也许是asp的问题。运气
  • @StevieB-仅仅因为屏幕截图显示了俄语字符,并不表示将其传递回数据库。我的猜测是,它在表单字段中和传递到服务器之间之间正在从Unicode转换而来。 SQL Profiler应该能够为您确认这一点。
  • @igor Yup起作用了! <%@ LANGUAGE = " VBSCRIPT " CODEPAGE = " 65001 "%>添加到页面顶部,将列类型更改为NVARCHAR可以解决问题
  • @Tom H.是的,您才意识到这一点。还有什么是SQL Profiler?
  • SQL Profiler是MS SQL Server附带的工具。它使您可以准确地监视服务器中要传入的内容。您可以过滤要跟踪的事件,以便在服务器看到它时可以看到确切的存储过程调用。在这些情况下,它可能是非常有用的调试工具。
  • 汤姆·H(Tom H.),我是否需要一直实时观看它,以等待插入完成或该工作如何完成,即我可以在其中运行一些虚拟值


这有效。我自己弄清楚了:

1
Command.Parameters.Add("@prc", SqlDbType.NVarChar).Value = strPrc;

您需要将SqlDbType更改为NVarChar。您还需要将字段更改为Nvarchar字段,并将存储过程也更改为该字段。


1
2
3
4
5
DECLARE @a nvarchar(50)
SET @a =N'???'

EXEC('INSERT INTO [dbo].[tblP] ([productVal],[name],[month])  VALUES ( 9, '+'N'''+@a+''',1)')
INSERT INTO [dbo].[tblP] ([productVal],[YEAR],[MONTH])  VALUES ( 9, N'???',1)

  • 除了代码外,请提供一些解释。