一个T-SQL语言的小问题(50分)

  • 主题发起人 主题发起人 bluenats
  • 开始时间 开始时间
B

bluenats

Unregistered / Unconfirmed
GUEST, unregistred user!
IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'cticrm')
DROP DATABASE [cticrm]
GO

请问'cticrm'前面的N是什么意思
 
http://www.cnsql.com/tipsdisp.asp?tipsid=299
也许能够说明问题,文章比较大,而且含有比较多的图片,看了一会,没有找到重点,就不摘抄了。
你自己看吧。
希望如果有答案的话,提炼出来放在这里。
不过,模糊的感觉应该是和语言种类有关。不过又说不清楚。
我想这也是很多人都不回答这个问题的原因吧。
找SQL Server的OnLine Help,也许会提到这个。
 
当在 WHERE 子句中搜索 Unicode 字符串时,在搜索字符串之前加字符 N,例如:

SELECT CompanyName, ContactName, Phone, Fax
FROM Northwind.dbo.Customers
WHERE CompanyName = N'Berglunds snabbk?p'
 
cticrm是一个变量是不是? N命令有点像宏,一般用在动态sql中,和sp_executesql一起用。
cticrm一般称为嵌入参数,一个简单例子:

Table1:
id test
------
1 语文
2 数学
3 英语

id int; test varchar(20)

N的用法:

DROP PROC TESTPROC
GO
CREATE PROC TESTPROC AS
declare @value varchar(20)
declare @strSQL Nvarchar(200)
set @strSQL = N'select @value=test from table1 where id=1'
exec sp_executesql @strSQL ,N'@value varchar(20) output',@value output
print @value

我们知道在动态sql中是无法实现select @value=test from table1 where id=1这样的
功能的,例如exec 'select @value=test from table1 where id=1'你是无法得到
变量@value; 但是加上N标志后,类似于一个宏替换,同时注意
exec sp_executesql @strsql后面的一些定义就知道N的用处了。

 
to:yzhshi
唉,我就是在online book里搜了半天,如同大海捞针一般,实在是找不到,才到这里来求救
to:watter
下面的代码是用ANSI格式生成的,也出现N,如果像你说的那样,在这里又是怎么回事?
to:bluerain
下面是用Enterprise生成的SQL Script,好像不像楼上这位所说是变量吧,能不能在解释一下
IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'cticrm')
DROP DATABASE [cticrm]
GO

CREATE DATABASE [cticrm] ON (NAME = N'cticrm_Data', FILENAME = N'D:/Program Files/Microsoft SQL Server/MSSQL/data/cticrm_Data.MDF' , SIZE = 6, FILEGROWTH = 10%) LOG ON (NAME = N'cticrm_Log', FILENAME = N'D:/Program Files/Microsoft SQL Server/MSSQL/data/cticrm_Log.LDF' , SIZE = 1, FILEGROWTH = 10%)
COLLATE Chinese_PRC_CI_AS
GO

exec sp_dboption N'cticrm', N'autoclose', N'false'
GO

exec sp_dboption N'cticrm', N'bulkcopy', N'false'
GO

exec sp_dboption N'cticrm', N'trunc. log', N'true'
GO

exec sp_dboption N'cticrm', N'torn page detection', N'true'
GO

exec sp_dboption N'cticrm', N'read only', N'false'
GO

exec sp_dboption N'cticrm', N'dbo use', N'false'
GO

exec sp_dboption N'cticrm', N'single', N'false'
GO

exec sp_dboption N'cticrm', N'autoshrink', N'true'
GO

exec sp_dboption N'cticrm', N'ANSI null default', N'false'
GO

exec sp_dboption N'cticrm', N'recursive triggers', N'false'
GO

exec sp_dboption N'cticrm', N'ANSI nulls', N'false'
GO

exec sp_dboption N'cticrm', N'concat null yields null', N'false'
GO

exec sp_dboption N'cticrm', N'cursor close on commit', N'false'
GO

exec sp_dboption N'cticrm', N'default to local cursor', N'false'
GO

exec sp_dboption N'cticrm', N'quoted identifier', N'false'
GO

exec sp_dboption N'cticrm', N'ANSI warnings', N'false'
GO

exec sp_dboption N'cticrm', N'auto create statistics', N'true'
GO

exec sp_dboption N'cticrm', N'auto update statistics', N'true'
GO

use [cticrm]
GO

 
早上一上班就在找这个帖子,怎么也找不到,还好有回复了。DFW这方面的检索功能不知
为什么一直没做。
昨天的帖子写的有些浮躁了,晚上觉得不对劲所以又查了一下帮助。
按我现在地理解是这样的:
N:表示将所跟随的字符串转换成Unicode类型字符串。
当然我们会觉得很奇怪,其实考虑一下Microsoft SQL Server是一个多语言系列的国际
版本就可以理解了。例如说我们的记录中有中文(双字节),阿拉伯兄弟的sql中有阿拉伯文,都
用Unicode字符串后,就可以解决中文的一个数据库系统放到阿拉伯版的sql server中了。
总之,这是为了在不同语言版本下通用,比如你的教本中cticrm是一个数据库的名次,也许
用的是中文,也许是别的什么语言。我们因为都是用的是中文版,所以N就用的很少。

附:
解释一下我上面那个回应的来由:
上面我的回应只是解释了一下N和sp_executesql的一个应用,sorry,把主题给弄混淆了。
这是由于sp_executesql的参数必须是nvarchar,ntext,nchar的缘故。而nvarchar,
ntext,nchar是unicode字符串。
 
to bluenats:
我上面的解释是从SQL的联机丛书摘录的,具体位置:
SQL 2000 中文版:访问和更改关系数据-->查询基础知识-->用WHERE和HAVING筛选行,在页面的最下面;
SQL 7.0 英文版:Accessing and Changing Data-->Query Fundamentals-->Filtering Rows with WHERE and HAVING

“下面的代码是用ANSI格式生成的,也出现N,如果像你说的那样,在这里又是怎么回事?”
我想应该是MicroSoft考虑到脚本的通用性吧
 
多人接受答案了。
 
后退
顶部