MSSQL中QuoteName的用法

MSSQL里的标识符是有一定的规则的,比如你创建一个表,如下:

创建表,并插入数据
 1 USE [DBName]
2 GO
3
4 /****** Object: Table [dbo].[a-b] Script Date: 04/06/2012 17:50:18 ******/
5 SET ANSI_NULLS ON
6 GO
7
8 SET QUOTED_IDENTIFIER ON
9 GO
10
11 CREATE TABLE [dbo].[a-b](
12 [a] [nchar](10) NULL,
13 [b] [nchar](10) NULL
14 ) ON [PRIMARY]
15
16 GO
17
18
19 INSERT INTO [a-b]
20 SELECT 'a','b'
21 UNION ALL
22 SELECT 'a','b'
23 UNION ALL
24 SELECT 'a','b'

依照我们平常的习惯,我们检索刚刚创建的表时,会采用如下的语句:

SELECT * FROM a-b

但当我们执行该语句时,MSSQL则提示:

消息 102,级别 15,状态 1,第 1 行
'-' 附近有语法错误。

那么你就会重新检查该检索语句,并用[]做定界标识符,并进行更改:

SELECT * FROM [a-b]

结果你会发现,执行的结果达到了我们的预期。

以上就证明了MSSQL里的标识符是有一定的规则的。

下面我们再举个例子,看看MSSQL是怎样处理该情况的:

比如你有一个表,名字叫 index;

你有一个动态查询,参数是表名;

示例二
/************************************************************
* Code formatted by SoftTree SQL Assistant ?v4.0.34
* Time: 2012/4/6 18:03:06
***********************************************************
*/

DECLARE @tbname VARCHAR(256)
SET @tbname = 'index'
---查这个表里的数据:
PRINT('select * from ' + @tbname)
EXEC ('select * from ' + @tbname)

--这样print出来的数据是
SELECT * FROM INDEX

--因为index是字键字,肯定出错,加上括号就可以了:

SELECT * FROM [index]

--这便有了QUOTENAME,即:

PRINT('select * from ' + QUOTENAME(@tbname))
--结果:select * from [index]
EXEC ('select * from ' + QUOTENAME(@tbname))

所以,QuoteName这个系统定义的字符串函数在执行动态查询时是相当有用的

posted @ 2012-04-06 18:07  Devil_Zhang  阅读(971)  评论(1编辑  收藏  举报