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这个系统定义的字符串函数在执行动态查询时是相当有用的