- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章sql cast,convert,QUOTENAME,exec 函数学习记录由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
语法 使用 CAST:
CAST ( expression AS data_type ) 。
使用 CONVERT:
CONVERT (data_type[(length)], expression [, style]) 。
参数 expression 。
是任何有效的 Microsoft SQL Server" 表达式。有关更多信息,请参见表达式.
data_type 。
目标系统所提供的数据类型,包括 bigint 和 sql_variant。不能使用用户定义的数据类型。有关可用的数据类型的更多信息,请参见数据类型.
length 。
nchar、nvarchar、char、varchar、binary 或 varbinary 数据类型的可选参数.
style 。
日期格式样式,借以将 datetime 或 smalldatetime 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型);或者字符串格式样式,借以将 float、real、money 或 smallmoney 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型).
将某种数据类型的表达式显式转换为另一种数据类型。有关可用的数据类型的更多信息,请参见数据类型。日期格式样式,借以将 datetime 或 smalldatetime 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型);或者字符串格式样式,借以将 float、real、money 或 smallmoney 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型)。当转换为字符数据时输出。 。
隐性转换对于用户是不可见的。 SQL Server 自动将数据从一种数据类型转换成另一种数据类型。例如,如果一个 smallint 变量和一个 int 变量相比较,这个 smallint 变量在比较前即被隐性转换成 int 变量.
显式转换使用 CAST 或 CONVERT 函数。 CAST 和 CONVERT 函数将数值从一个数据类型(局部变量、列或其它表达式)转换到另一个数据类型.
例如,下面的 CAST 函数将数值 $157.27 转换成字符串 ''$157.27'':CAST ( $157.27 AS VARCHAR(10) ) CAST 函数基于 SQL-92 标准并且优先于 CONVERT.
当从一个 SQL Server 对象的数据类型向另一个转换时,一些隐性和显式数据类型转换是不支持的。例如,nchar 数值根本就不能被转换成 image 数值。nchar 只能显式地转换成 binary,隐性地转换到 binary 是不支持的。nchar 可以显式地或者隐性地转换成 nvarchar.
当处理 sql_variant 数据类型时,SQL Server 支持将具有其它数据类型的对象隐性转换成 sql_variant 类型。然而,SQL Server 并不支持从 sql_variant 数据隐性地转换到其它数据类型的对象.
SELECT CONVERT(CHAR(10), CURRENT_TIMESTAMP, 102) (102表明使用了ANSI日期模式,即yy.mm.dd型) 然而,如果你希望将这个变量明确生成为datetime或smalldatetime变量,以此在特定的数据库栏中兼容,那么你可以使用以下语句: SELECT CAST(CONVERT(CHAR(10),CURRENT_TIMESTAMP,102) AS DATETIME 返回值将是 yy.mm.dd 00:00:00(如12:00AM作为时间戳; 。
函数QUOTENAME --功能:返回带有分隔符的Unicode 字符串,分隔符的加入可使输入的字符串成为有效的Microsoft SQL Server 2005 分隔标识符。 --语法 QUOTENAME ( 'character_string' [ , 'quote_character' ] ) --举例说明: --比如你有一个表,名字叫index --你有一个动态查询,参数是表名 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)) 。
EXEC命令有两个用法:执行一个存储过程,或者执行一个动态批次。批次是一个内容为SQL语句的字符串。 例如: declare @schemaName varchar(80),@tableName varchar(80), @objName varchar(512); set @schemaName='dbo'; set @tableName='Orders'; set @objName=@schemaName+'.'+@tableName; exec('select count(*) from '+@objName),
注意,在exec的括号里,只允许是字符串变量、字符串常量存在。不允许在这里调用函数或者使用case表达式。 下面的代码是错误的: exec('select count(*) from '+quotename(@objName)); 所以,基本的方法是将语句保存到一个变量里,例如: set @sql='...'; exec(@sql); 这就不存在上述限制了.
1 EXEC没有接口 Exec的唯一输入是字符串。一个动态批次无权访问调用它的批次内所定义的局部变量: declare @i int set @i=1; declare @sql varchar(255) set @sql='select * from dbo.orders where rderid=@i'; exec(@sql); 出错:必须声明标量变量@i 原因还是@i不能放在''之内,它只能通过字符串连接动态的嵌入到SQL语句里: set @sql='select * from dbo.orders where rderid='+cast(@i as varchar(10)),
变量与字符串连接会引发所谓的SQL注入安全隐患,如果变量包含了字符串。要防患SQL注入的一个办法是限制 字符串的大小。 这种连接会对性能造成映像。SS会为每个字符串单独创建一个执行计划,无论两个字符串是否是一个模式。为此, 下面显示了一个例子: 首先清除cache里的执行计划: DBCC freeproccache; 然后执行下面的代码三次,分别将@i设置为10248,10249,10250 DECLARE @i AS INT; SET @i = 10248,
DECLARE @sql AS VARCHAR(52); SET @sql = 'SELECT * FROM dbo.Orders WHERE rderID = ' + CAST(@i AS VARCHAR(10)) + N';'; EXEC(@sql) 最后查询sys.syscacheobjects: SELECT cacheobjtype, objtype, usecounts, sql FROM sys.syscacheobjects WHERE sql NOT LIKE '%cache%' AND sql NOT LIKE '%sys.%'; 结果显示为: 它会为每次查询生成一个执行计划。以及一个参数化的执行计划.
EXEC也没有输出参数。缺省情况下,exec将返回该次查询的输出给调用者。如果希望将该结果保存到变量里,那就必须 使用Insert EXEC语法,并从表里从新读取该数据,然后储存到目标变量里。 DECLARE @schemaname AS NVARCHAR(128), @tablename AS NVARCHAR(128), @colname AS NVARCHAR(128), @sql AS NVARCHAR(805), @cnt AS INT,
SET @schemaname = N'dbo'; SET @tablename = N'Orders'; SET @colname = N'CustomerID'; SET @sql = N'SELECT COUNT(DISTINCT ' + QUOTENAME(@colname) + N') FROM ' + QUOTENAME(@schemaname) + N'.' + QUOTENAME(@tablename) + N';',
CREATE TABLE #T(cnt INT); INSERT INTO #T EXEC(@sql); SET @cnt = (SELECT cnt FROM #T); SELECT @cnt; DROP TABLE #T,
注意如果忘记输入最后的一条语句“Drop 。。。”,那么就会出现下面的令人讨厌的错误: 数据库中已存在名为 '#T' 的对象。 在上面这段程序里,创建了一个临时表,它对于动态批次是可见的。所以可以修改上面的程序为: SET @sql = N'INSERT INTO #T(cnt) SELECT COUNT(DISTINCT ' + QUOTENAME(@colname) + N') FROM ' + QUOTENAME(@schemaname) + N'.' + QUOTENAME(@tablename) + N';',
CREATE TABLE #T(cnt INT); EXEC(@sql); SET @cnt = (SELECT cnt FROM #T); SELECT @cnt; DROP TABLE #T; 因为EXEC的执行是在Create Table之后,所以Insert语句可以移到@sql的定义里.
2 变量的连接 在SS2000里,EXEC优于sp_executesql的一点是,它支持输入的代码长度要长一些。虽然,从技术上说后者的 输入代码字符串是NTEXT类型,通常希望用一个局部变量来保存它。但是,局部变量是不能声明成大对象类型的。 所以,实际上sp_executesql的最大支持的字符串长度是Unicode字符串的长度(NVARCHAR,4000个字符)。而 EXEC,则支持常规的字符串(VARCHAR),即8000个字符。 而且,EXEC支持多个变量的连接,每个变量最大有8000个字符.
不过在SS2005里,变量类型可以是VARCHAR(max),最大为2G。 3 EXEC AT 这是05里的新语法。执行远程主机上的动态SQL语句 。
加上 N 代表存入数据库时以 Unicode 格式存储。 N'string' 表示string是个Unicode字符串 Unicode 字符串的格式与普通字符串相似,但它前面有一个 N 标识符(N 代表 SQL-92 标准中的国际语言 (National Language))。N 前缀必须是大写字母。例如,'Michél' 是字符串常量而 N'Michél' 则是 Unicode 常量。Unicode 常量被解释为 Unicode 数据,并且不使用代码页进行计算。Unicode 常量确实有排序规则,主要用于控制比较和区分大小写。为 Unicode 常量指派当前数据库的默认排序规则,除非使用 COLLATE 子句为其指定了排序规则。Unicode 数据中的每个字符都使用两个字节进行存储,而字符数据中的每个字符则都使用一个字节进行存储。有关更多信息,请参见使用 Unicode 数据。 Unicode 字符串常量支持增强的排序规则 。
数据库名是一个标识符,表名也是一个标识符,在SQL SERVER中标识符分为两类:
标识符有两类:
常规标识符 。
符合标识符的格式规则。在 Transact-SQL 语句中使用常规标识符时不用将其分隔.
SELECT *FROM TableXWHERE KeyCol = 124
分隔标识符 。
包含在双引号 (") 或者方括号 ([ ]) 内。符合标识符格式规则的标识符可以分隔,也可以不分隔.
SELECT *FROM [TableX] --Delimiter is optional.WHERE [KeyCol] = 124 --Delimiter is optional.
在 Transact-SQL 语句中,对不符合所有标识符规则的标识符必须进行分隔.
SELECT *FROM [My Table] --Identifier contains a space and uses a reserved keyword.WHERE [order] = 10 --Identifier is a reserved keyword.
常规标识符和分隔标识符包含的字符数必须在 1 到 128 之间。对于本地临时表,标识符最多可以有 116 个字符.
两者重要的区别:常规标识符必须严格遵守命名的规定,而分隔标识符则可以不遵守命名规定,只要用[],""分隔出来就可以.
标识符格式: 1、标识符必须是统一码(Unicode)2.0标准中规定的字符,以及其他一些语言字符。如汉字. 2、标识符后的字符可以是(除条件一)“_”、“@”、“#”、“$”及数字。 3、标识符不允许是Transact-SQL的保留字。 4、标识符内不允许有空格和特殊字符。 另外,某些以特殊符号开头的标识符在SQL SERVER 中具有特定的含义.
如以“@”开头的标识符表示这是一个局部变量或是一个函数的参数;以#开头的标识符表示这是一个临时表或是一存储过程.
以“##”开头的表示这是一个全局的临时数据库对象。T 。
ransact-SQL的全局变量以“@@”开头.
标识符最多可以容纳128个字符.
最后此篇关于sql cast,convert,QUOTENAME,exec 函数学习记录的文章就讲到这里了,如果你想了解更多关于sql cast,convert,QUOTENAME,exec 函数学习记录的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!