MSSQL存储过程实现拼接sql的注意点
这里我昨天碰到的问题就是执行一段根据变量tableName对不同的表进行字段状态的更改。由于服务器原因,我不能直接在数据访问层写SQL,所以只好抽离出来放到存储过程里面。
这里就出现了一个问题,我花费了好久才弄通!
其实就是很简单的一个SQL语句:
update table1 set field1=value1,field2 = value2 where id = id
我写成什么样子了呢?大家且看:
declare @tableName nvarchar(50), @field1 int, @field2 nvarchar, @id int
declare @sql nvarchar(max) set @sql = 'update '+@tableName+' set field1= '+@field1+',field2= '+@field2+' where id='+@id exec @sql
有过这方面经验的同学肯定知道这样写明显是错的,sql会报异常,说无法讲nvarchar转换成int类型
那么这个错误是具体是值什么呢?其实就是说,在拼接sql的时候,这个@sql要是一个字符串类型,所有的变量也都必须用字符串表示,我上面的@field1和@id是int,所以要转化成nvarchar类型,并且是nvarchar类型的变量(字段)必须用单引号括起来;注:在sql中单引号是用两个单引号表示的
所以经过修改,正确的拼接sql代码是:
set @sql='update '+@tableName+ ' set field1='+cast(@field1 as varchar)+',field2='''+@field2+''' where id='+CAST(@id as varchar)
这个问题其实非常简单,但是由于我在SQL方面的知识很是不足,所以在这里记录来巩固自己
MSSQL存储过程实现拼接sql的注意点的更多相关文章
- 在mysql存储过程中拼接sql解决in的字段类型不匹配问题
一个朋友问我一个问题,他写了一个存储过程,并在存储过程调用了另外一个自定义的函数.该函数返回类型如'1,34,56'的字符串,并将该字符串作为存储过程的select的id条件. begin DECLA ...
- 存储过程中拼接SQL语句
很多时候我们需要利用参数在存储过程中重新组织SQL语句,在存储过程中拼接的SQL语句只是一个字符串,不会被直接执行,所以加一个execute执行它就可以了.具体看如下演示代码: 代码: set ANS ...
- mysql 存储过程动态拼接sql并执行赋值
)) BEGIN ## 定义变量 ,) ; ## @表示全局变量 相当于php $ ## 拼接赋值 INTO 必须要用全局变量不然语句会报错 SET @strsql = CONCAT('SELECT ...
- 存储过程中拼接sql并且参数化
ALTER PROCEDURE [dbo].[proc_test] ( ) = ' order by id desc ', @userid int, @stime datetime, @etime d ...
- 存储过程中拼接sql的示例
create or replace package body CRF_CMS_DOCTOR_PKG is --根据医院查询医生PROCEDURE P_HOSPITALBYDOCTOR_LIST ( v ...
- sqlserver 存储过程中拼接sql语句 动态执行
ALTER PROC [dbo].[Student_Friend_Get] @startRowIndexId INT, @maxNumberRows INT, @schoolId INT, @grad ...
- mysql 存储过程动态执行sql语句
之前经常在程序中拼接sql语句,其实我们也可以在存储过程中拼接sql 语句,动态的执行~~ 代码如下: DROP PROCEDURE IF EXISTS SearchByDoctor;CREATE P ...
- 存储过程往拼接的sql语句中传递日期值
存储过程往拼接的sql语句中传递日期值 declare @start datetime declare @end datetime set @start='2014-3-1' set @end='20 ...
- 解决存储过程中拼接的SQL字符串超长导致sql语句被截取的问题
今天遇到了一个奇葩的问题:存储过程中的sql字符串拼接的太长,超出了分页存储过程执行sql参数的nvarchar(4000)的长度. 没办法,只能修改自己的存储过程,因为分页存储过程是不能动的. 开始 ...
随机推荐
- WebApi(2)
WebApi2 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !importa ...
- Map 综述(三):彻头彻尾理解 ConcurrentHashMap
https://blog.csdn.net/justloveyou_/article/details/72783008
- 《JavaScript高级程序设计》第六章【面向对象的程序设计】 包括对象、创建对象、继承
一.理解对象 二.创建对象 1. 工厂模式 2. 构造函数模式 3. 原型模式 4. 组合使用构造函数模式和原型模式[使用最广泛] 5. 动态原型模式 ...
- celery_消息队列
http://www.cnblogs.com/wupeiqi/articles/8796552.html 一. celery 简介 Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时 ...
- session 和cookie
(1)cookie与session---------->>>>>>>>>>>>>>>>>>& ...
- Android 日常总结的一些方法使用
1. setImageResource : 更改图片的资源 2. setClickable : 设置为true时,表明控件可以点击,如果为false,就不能点击 . 注意,setOnClickLi ...
- zoj3497 Mistwald(矩阵快速幂)
题意:给定一个有向图(最多25个节点,每个节点的出度最多为4),给定起点和终点,然后从起点开始走,走到终点就停止,否则一直往下走,问能不能P步到达终点.也就是说从起点出发,走一条长度为P的路径,路径中 ...
- SSL学习笔记
/************************************数据类型***************************************//* Number(数值型),Bool ...
- n层满k叉树总共有多少个节点
2叉树 1 3 7 对应公式为(2^n-1)/1 3叉树 1 4 13 对应公式为(3^n-1)/2 4叉树 1 5 21对应公式为(4^n-1)/3 ... n层k叉树,总共有(k^n-1)/k-1 ...
- nginx配置跨域、gzip加速、代理详细讲解
1.配置跨域 这个很简单,直接打开配置nginx.conf ,在http下配置下面三行代码:当然如果你是想某一个虚拟主机下跨域,那就在哪个server下面添加 add_header Access-Co ...