`
understanding
  • 浏览: 3540 次
  • 性别: Icon_minigender_1
  • 来自: 烟台市
最近访客 更多访客>>
社区版块
存档分类
最新评论

mssqlserver 存储过程 sql语句 拼接字符串

阅读更多

单就 MSSQLSERVER

 分以下情况 (可以 用print 来验证 dbms 是怎么 来理解的 )

 1. print 'abc'  得到 abc

 2. print 'abc=''d' 得到 abc='d

 3.print 'abc=''d''' 得到 abc='d'

 4.print 'abc='''+'d'+'' 得到abc='d

 5.print 'abc='''+'d'+'''' 得到 abc='d'

 以上需要注意的是 1. 紧邻的一对单引号  单独的在一块时 则 被理解为 空字符串 2.紧邻的一对单引号 被包含在另一对单引号中时  则 被理解为 ‘ (一个单引号) 这里也不知道是不是类似于转义功能

 

6.当存在非字符串 数据类型 的情况下

 要将 非字符串类型 利用 cast 或 convert 转换类型

关于 两者 怎么使用的问题 下面是转载过来的 挺好

 

文章一

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

语法
使用 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个字符。
详细出处参考:http://www.jb51.net/article/20644.htm

 

文章二

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 如果SQL Server程序员想将表达式从一种换为另一种,他可以从SQL Server 7和2000中自带的两种功能中做出选择。在存储过程或其他情况下,我们常常需要将数据从datetime型转化成varchar型;CONVERT和 CAST就可以用于这种情况。 由于SQL Server提供两种功能,因此应该选择哪种功能或应该在哪种情况下使用该功能就很容易让人困惑了。CONVERT是专对SQL Server使用的,使日期与时间值,小数之间转换具有更宽的灵活性。 CAST是两种功能中更具ANSI标准的功能,即虽然更具便携性(比如,使用CAST的函数能更容易的被其它数据库软件使用),但功能相对弱一些。不过, 当小数转化为数值,并保留原始表达式中的小数数值时,仍然需要使用CAST。因此,我建议首先使用CAST,如果遇到必须使用CONVERT的情况时再使 用CONVERT。 CAST和CONVERT还能联合使用,达到特殊的效果。比如,在current date下生成char变量一般使用以下方法: 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作为时间戳;

 

 

接上总结

 6. print ’abc='+ cast(3 as varchar) 得到 abc=3

   print 'abc='+convert(varchar,32) 得到 abc=32

分享到:
评论

相关推荐

    Sql Server 的SQL语句案例

    在Sql Server 2008中,常见的字段类型有bit(布尔值)、datetime(日期和时间)、int(整数)、varchar(可变长度的非Unicode字符串)和nvarchar(可变长度的Unicode字符串)。例如,nvarchar(50)能存储最多50个...

    在SQL语句如何获得MSSQLSERVER登录用户和密码

    sysusers 系统视图包含了 SQL Server 实例中的所有登录用户信息,可以使用以下语句来获取登录用户和密码: ``` SELECT name, password FROM sysusers WHERE name = USER_NAME() ``` 五、穷举法破解 SQL Server ...

    SupplyAGSlnProcedure(MSSQLserver存储过程的写法)

    SupplyAGSlnProcedure(MSSQLserver存储过程的写法),写储存过程一定要标准一点,要和不写,要写就要写好注释,还有测试到位。

    SQL server 2000数据库连接驱动文件msbase +mssqlserver+msutil

    例如,支持SQL Server特有的数据类型,如`image`、`ntext`、`text`等,以及一些高级特性如游标、事务管理、存储过程等。这个驱动文件使得Java应用能够充分利用SQL Server 2000的所有功能,而不仅仅是基本的CRUD操作...

    SQLServer导出为Insert语句

    在SQL Server中,可以使用多种工具或T-SQL语句来导出数据,例如`bcp`命令行工具,`SELECT INTO`语句,或者使用SSMS(SQL Server Management Studio)的“任务”>“生成脚本”功能。 4. **Insert语句**:在SQL中,...

    Pemrograman SQL 01_sql_MSSQLServer_programming_

    MSSQLServer还提供了存储过程,这是一种预编译的SQL语句集合,可以封装复杂逻辑并多次调用。通过使用存储过程,可以提高代码复用性,减少网络通信,并提升系统性能。另外,触发器则是一种特殊的存储过程,会在特定的...

    SQLSERVER基础实用必会SQL语句整理.docx

    SQLSERVER基础实用必会SQL语句整理 本文档旨在整理SQLSERVER基础实用必会SQL语句,涵盖数据库的创建、备份、还原等问题的解决方法,并提供了一些有用的SQL语句命令。 一、SQLSERVER数据库的安装问题 在安装SQL...

    Pemrograman SQL 04_sql_MSSQLServer_programming_

    2. **数据类型**:SQL支持多种数据类型,如INT(整数),VARCHAR(可变长度字符串),DATE(日期)等,理解这些类型对于正确存储和检索数据至关重要。 3. **表的创建**:使用CREATE TABLE语句可以定义数据库中的...

    Sql智能提示-MsSqlServer插件

    5. **对象浏览**:插件还提供了一个数据库对象浏览器,允许用户直观地查看和导航数据库中的表、视图、存储过程和其他对象,方便在编写SQL时快速定位所需资源。 6. **性能分析**:在编写复杂查询时,插件有时会提供...

    Pemrograman SQL 02_sql_MSSQLServer_programming_

    2. **数据类型**:SQL支持多种数据类型,如整数(INTEGER)、浮点数(FLOAT)、字符串(VARCHAR)、日期/时间(DATE/TIME)等,理解这些数据类型对于正确存储和处理数据至关重要。 3. **表的操作**:创建(CREATE ...

    Oracle中字符串连接的实现方法

    代码如下:SELECT ‘工号为’||FNumber||’的员工姓名为’||FName FROM T_Employee WHERE FName IS NOT NULL 除了“||”,Oracle还支持使用CONCAT()函数进行字符串拼接,比如执行下面的SQL语句: SELECT CONCAT(...

    SQL Server 2000数据库驱动包 msbase.jar mssqlserver.jar msutil.jar

    SQL Server 2000是微软公司推出的一款关系型数据库管理系统,它在企业级数据存储、管理和分析中扮演着重要角色。在这个特定的压缩包中,包含三个关键的Java档案文件:msbase.jar、mssqlserver.jar和msutil.jar。这些...

    SQLServel的jdbc驱动包msbase.jar,mssqlserver.jar和msutil.jar

    此外,它还支持SQLServer的特定数据类型,如image、text、ntext、timestamp等,并提供了对SQLServer存储过程、触发器等高级特性的调用能力。 msutil.jar则包含了一些实用工具和辅助类,这些类在进行数据库操作时...

    使用存储过程访问MsSqlServer2000并带返回值+MD5加密

    首先,存储过程(Stored Procedure)是预编译的SQL语句集合,它们封装在数据库中,可以执行特定的任务或处理数据。在MsSqlServer 2000中,存储过程提供了一种高效、安全的方式来操作数据,因为它们减少了网络通信,...

    Mysql中sql语句游标详解

    - **应用场景**:主要用于服务器端的数据处理,可以通过客户端发送的SQL语句或存储过程进行管理。 - **特点**:不支持提取数据块或多行数据。 ##### 3.2 API游标 - **定义**:虽然MySQL没有直接支持API游标这一概念...

    把msSqlServer 中的数据导出成 insert into语句

    综上所述,存储过程`dbo.UspOutputData`提供了一种灵活且强大的方法,用于将MS SQL Server中的数据导出为SQL插入语句,极大地简化了数据迁移和脚本化工作流程。然而,使用时也应充分考虑其局限性和潜在风险,采取...

    【MSSQLServer】 T-SQL 整理

    - **存储过程**:一组预编译的T-SQL语句,可视为数据库中的可执行程序,能接受参数,返回结果集,提高性能和安全性。 5. **视图** - **视图**:虚拟表,基于一个或多个表的SELECT语句,提供不同视角的数据访问,...

    常用JAR包、jtds-1.2、log4j-1.2.6、mssqlserver2、sqljdbc

    这个驱动是微软官方的“Java Database Connectivity”(JDBC)驱动,用于在Java应用程序中执行SQL语句,执行事务,处理结果集等。 4. **sqljdbc**: SQL Server JDBC驱动是微软提供的,用于Java应用程序连接到SQL ...

    Sql Server语句经典大全

    同时,我们还需要了解 SQL Server 的优化技术,如索引、视图、存储过程等。 结论 SQL Server 语句大全是 SQL 语言的核心部分,我们需要熟悉这些语句来管理和查询数据库。只有通过实践和学习,我们才能掌握这些语句...

    Pemrograman SQL 03_sql_MSSQLServer_programming_

    存储过程是一组预先编译的SQL语句,可以多次重复使用,提高效率并减少错误。函数则是执行特定任务的预定义代码块,可直接在查询中调用,如内置的COUNT(), SUM(), AVG()等聚合函数。 在MSSQLServer环境中,我们还将...

Global site tag (gtag.js) - Google Analytics