SQL Server数据库存储过程中拼接字符串注意的问题

  在SQL Server数据库中书写复杂的存储过程时,一般的做法是拼接字符串,最后使用EXEC sp_executesql ‘拼接的字符串‘ 查询出结果。

先看一段代码:

 1 -- =============================================
 2 -- Author:        XXX
 3 -- Create date: 2014-09-19
 4 -- Description:    获取学生列表信息
 5 -- =============================================
 6 ALTER PROCEDURE [dbo].[Sp_GetStudentList]
 7     @StudentId INT   --主键id
 8 AS
 9 BEGIN
10
11     SET NOCOUNT ON;
12
13     DECLARE @SqlSelectResult NVARCHAR(MAX) = ‘‘;
14     SET @SqlSelectResult = ‘SELECT * FROM Student AS s ‘;
15
16     IF (ISNULL(@StudentId, 0) > 0)
17     BEGIN
18         SET @SqlSelectResult = @SqlSelectResult + ‘ WHERE s.ClassId > ‘ + @StudentId;
19     END
20
21     PRINT (@SqlSelectResult);
22
23     EXEC sp_executesql @SqlSelectResult;
24
25     SET NOCOUNT OFF;
26 END

然后调用该存储过程:EXEC Sp_GetStudentList 1。结果如下:

运行失败。

仔细分析原因发现:存储过程参数@StudentId 类型为INT(整形)型;而自定义变量@SqlSelectResult是NVARCHAR(MAX)字符串类型。

在23行,EXEC sp_executesql @SqlSelectResult;执行拼接字符串时,报错,编译器尝试将字符串类型转换成int类型失败。

意思是:SQL Server中在拼接字符串时,所有的变量必须全部是字符串类型,才能正确拼接,否则报错。

解决方法1:将非字符串类型的变量转换为字符串类型,

                   将18行代码修改为:

        SET @SqlSelectResult = @SqlSelectResult + ‘ WHERE s.ClassId > ‘ + convert(nvarchar(10),@StudentId);

解决方法2:在存储过程开始定义的时候,将参数定义为字符串类型
               ALTER PROCEDURE [dbo].[Sp_GetStudentList]
               @StudentId INT   --主键id
               AS               ……

 
时间: 2024-11-04 19:39:27

SQL Server数据库存储过程中拼接字符串注意的问题的相关文章

将txt文件内容导入sql server 数据库表中

将类似这样的txt文件,如何导入到sql server 数据库表中呢? 第一步,在开始菜单中 找到 sql server 的导入和导出数据 然后,在数据源 的下拉框中 选择 平面文件源 基本都是点击 下一步 选择好要导入数据的数据库 与表: 编辑映射 : 点击下一步 执行 然后 完成 查看数据库 表 数据已经导入 成功

C#与sql server数据库存储过程的操作实例

通过这几天的学习和实际操作,把C#与sql server数据库存储过程的操作搞清楚了. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Windows.

SQL Server:存储过程中编写事务处理的方法小结

/**8. SQLServer存储过程中编写事务处理的方法小结**/ 原文出处: http://www.jb51.net/article/80636.htm 本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码. 1. 常见写法: 在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ... delete statement 3 ... c

在 SQL Server 的存储过程中调用 Web 服务

介绍 一个老朋友计划开发一个应用,基于 .NET 和 Socket,但需要在存储过程中调用 Web 服务. 在这篇文章中我们将分享这个应用的经验,讲述如何在存储过程中调用 Web 服务,并传递参数. Step 1 首先我们在 Visual Studio 中创建一个 Web 服务项目: Step 2 接下来在服务中添加我们需要的方法,在这里我们创建 6 个方法,分别是 Greet (string Param1) ,HelloWord() , Add, subtract, 和 Divide (Num

存储过程中拼接字符串

1.将查询数据插入临时表 最开始我这么写的 DECLARE @sql varchar(max) SET @sql='select * into #tmp from tb' EXEC(@sql) SELECT * FROM #tmp 报错 对象名'#tmp'无效 可以改成这样子 CREATE TABLE #tmp(....) DECLARE @sql varchar(max) SET @sql='select * from tb' INSERT #tmp EXEC(@sql) SELECT * F

如何将sql server 数据库表中的某一列的某一字符替换成需要的字符

实例:select   replace(chexing, '微型车', '0001')   from   T_MODEL chexing:要替换的字段名称. 微型车:要被替换的内容. 0001:替换后的内容. 注:replace适用于非:text,ntext字段!!

SQL Server 数据库的安全管理(登录、角色、权限)

---数据库的安全管理 --登录:SQL Server数据库服务器登录的身份验证模式:1)Windows身份验证.2)Windows和SQL Server混合验证 --角色:分类:1)服务器角色.服务器角色是固定的服务器功能,用户不能创建和修改服务器角色.可以将服务器的登录账号添加服务器角色中,使其具备服务器角色的权限.2)数据库角色.数据库角色的作用对象是某一个数据库,用来将登录数据库的用户添加到数据库角色中,使其具备数据库角色的功能. --数据库角色包括固定数据库角色.标准数据库角色和应用程

让你提前认识软件开发(28):数据库存储过程中的重要表信息的保存及相关建议

第2部分 数据库SQL语言 数据库存储过程中的重要表信息的保存及相关建议 1. 存储过程中的重要表信息的保存 在很多存储过程中,会涉及到对表数据的更新.插入或删除等,为了防止修改之后的表数据出现问题,同时方便追踪问题,一般会为一些重要的表建立一个对应的debug表.这个debug表中的字段要包括原表的所有字段,同时要增加操作时间.操作码和操作描述等字段信息. 例如,在某项目中,包括了如下一个重要的表tb_XXX: create table tb_XXX (      AAA           

SQL Server 数据库分离与附加

一.概述 SQL Server提供了“分离/附加”数据库.“备份/还原”数据库.复制数据库等多种数据库的备份和恢复方法.这里介绍一种学习中常用的“分离/附加”方法,类似于大家熟悉的“文件拷贝”方法,即把数据库文件(.MDF)和对应的日志文件(.LDF)拷贝到其它磁盘上作备份,然后把这两个文件再拷贝到任何需要这个数据库的系统之中.比如,在实验教学过程中,同学们常常想把自己在学校实验室计算机中创建的数据库搬迁到自己的计算机中而不想重新创建该数据库,就可以使用这种简单的方法.但由于数据库管理系统的特殊