㈠ 带变量的sql语句,要返回一个结果时,怎么样的到结果
如果要使用得到的变量,可以用一个临时表#tmp保存,用完要记得删表。
declare @id int
declare @tabName varchar(20)
declare @sql varchar(255)
set @sql = 'select stuId into #tmp from '+@tabName
exec(@sql)
select @id=stuId from #tmp
drop table #tmp
print @id
㈡ 带有变量sql语句应该怎么写
'"+ a + "'这个写法不变,
再执行SQL语句的时候executeSql(sql.replaceAll("'",""))这样写,要把单引号去掉,
因为你发现单引号的field是不能在mysql中查询的,这和where中的条件还不一样!
请叫我雷锋
㈢ 如何执行绑定变量的SQL
1. 认识绑定变量:
绑定变量是为了减少解析的,比如你有个语句这样
select aaa,bbb from ccc where ddd=eee;
如果经常通过改变eee这个谓词赋值来查询,像如下
select aaa,bbb from ccc where ddd=fff;
select aaa,bbb from ccc where ddd=ggg;
select aaa,bbb from ccc where ddd=hhh;
每条语句都要被数据库解析一次,这样比较浪费资源,如果把eee换成“:1”这样的绑定变量形式,无论ddd后面是什么值,都不需要重复解析
Java实现绑定变量的方法:
[java] view plain
PreparedStatement pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 15.00);
pstmt.setInt(2, 110592);
/result statmement: UPDATE employees SET salay = 15.00 WHERE id = 110592
pstmt.executeQuery();
假设要将id从1到10000的员工的工资都更新为150.00元,不使用绑定变量,则:[java] view plain sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 1"); sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 2"); sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 3"); sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 4"); .... sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 10000"); 使用绑定变量,则:
[java] view plain PreparedStatement pstmt; for (id = 1; id < 10000; id++) { if (null == pstmt) pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?"); pstmt.setBigDecimal(1, 150.00); pstmt.setInt(2, id); pstmt.executeQuery(); } 二者区别在于,不用绑定变量,则相当于反复解析、执行了1w个sql语句。使用绑定变量,解析sql语句只用了一次,之后的9999次复用第一次生成的执行计划。显然,后者效率会更高一些。
2. 什么时候不应该/不必要使用绑定变量
a. 如果你用数据仓库,一条大查询一跑几个小时,根本没必要做绑定变量,因为解析的消耗微乎其微。b. 变量对优化器产生执行计划有很重要的影响的时候:绑定变量被使用时,查询优化器会忽略其具体值,因此其预估的准确性远不如使用字面量值真实,尤其是在表存在数据倾斜(表上的数据非均匀分布)的列上会提供错误的执行计划。从而使得非高效的执行计划被使用。
3. 绑定变量在OceanBase中的实现
目前OceanBase中实现了绑定变量,目的主要是为了编程方便,而不是为了降低生成执行计划的代价。为什么呢?因为OceanBase中目前使用的是一种”静态执行计划“,无论什么Query,执行流程都一样。OB在前端代理ObConnector中实现绑定变量,将用户传入的变量进行to_string()操作,替代SQL语句中相应的部分,形成一个完整的SQL。然后这个SQL传递给MS,MS按照标准流程来解析和执行。相信不远的将来,OB将会实现真正意义上的绑定变量,让用户享受到绑定变量带来的好处。
㈣ MS SQL 在存储过程中怎样执行用变量组合的SQL语句
创建:
create procere p_1
as
declare @empcode nvarchar(10)
declare @result nvarchar(20)
begin
set @empcode='1001'
select @result=c_name from employee where empcode=@empcode
print @result
end
执行:exec p_1
㈤ sql 执行变量语句
可以啊 ,动态sql语句,如:
declare @sql varchar(2000),@id int
set @id=100
set @sql='select * from test where id='+cast(@id as varchar)
print @sql
exec @sql
㈥ 动态执行SQL语句,拼接字符串,select中带有一个变量
--1. 构造使用IN子句的动态Transact-SQL方法进行编号查询
--a. 要查询的字段类型是数字型
--查询的值列表
DECLARE @idlist varchar(100)
SET @idlist='1,2,3'
--拼接并执行动态Transact-SQL语句
EXEC('SELECT * FROM tbname WHERE fdname IN('+@idlist+')')
GO
--b. 要查询的字段类型是字符型
--查询的值列表已经加上了字符串边界符
DECLARE @idlist varchar(100)
SET @idlist='''a'',''b''''a'',''c'''
--拼接并执行动态Transact-SQL语句
EXEC('SELECT * FROM tbname WHERE fdname IN('+@idlist+')')
GO
--查询的值列表没有字符串边界符
DECLARE @idlist varchar(100)
SET @idlist='a,b''a,c'
--由于是字段类型是,所以在拼接时,必须为其加上字符串边界符(')
DECLARE @s varchar(1000)
SET @s=''''
+REPLACE(REPLACE(@idlist,'''',''''''),',',''',''')
+''''
--拼接并执行动态Transact-SQL语句
EXEC('SELECT * FROM tbname WHERE fdname IN('+@s+')')
GO
/*=====================================================*/
--2. 使用LIKE或者PATINDEX进行编号查询
--查询的值列表
DECLARE @idlist varchar(100)
SET @idlist='1,2,3'
--查询
SELECT * FROM tbname WHERE CHARINDEX(','+RTRIM(fdname)+',',','+@idlist+',')>0
SELECT * FROM tbname WHERE PATINDEX('%,'+RTRIM(fdname)+',%',','+@idlist+',')>0
SELECT * FROM tbname WHERE ','+@idlist+',' LIKE '%,'+RTRIM(fdname)+',%'
GO
/*=====================================================*/
--3. 编号查询中常见的错误
--a. 最容易犯的错误:表达式充当表达式列表。
DECLARE @s varchar(100)
SET @s='1'
SELECT id,name FROM sysobjects WHERE id IN(@s)
/*--结果
id name
---------------- ------------
1 sysobjects
--*/
SET @s='1,2,3'
SELECT id,name FROM sysobjects WHERE id IN(@s)
/*--结果
服务器: 消息 245,级别 16,状态 1,行 3
将 varchar 值 '1,2,3' 转换为数据类型为 int 的列时发生语法错误。
--*/
GO
--b. 生成动态Transact-SQL语句时忽略了数据类型。
DECLARE @s varchar(100)
SET @s='U,S'
EXEC('SELECT id,name FROM sysobjects WHERE id IN('+@s+')')
/*--结果:
服务器: 消息 207,级别 16,状态 3,行 1
列名 'S' 无效。
服务器: 消息 207,级别 16,状态 1,行 1
列名 'U' 无效。
--*/
GO
--c. 忽略了比较的精确性问题。
--要查询的数据
DECLARE @t TABLE(col varchar(10))
INSERT @t SELECT '1'
UNION ALL SELECT '11'
UNION ALL SELECT '111'
UNION ALL SELECT '22'
--查询
DECLARE @s varchar(100)
SET @s='111,22'
SELECT * FROM @t WHERE CHARINDEX(col,@s)>0
/*--结果
col
----------
1
11
111
22
-*/
GO
㈦ SQL 变量执行的问题
将EXEC ( 'SELECT * FROM Person.Person WHERE FirstName = ' + @OutVar);
改为
EXEC ( 'SELECT * FROM Person.Person WHERE FirstName = ''' + @OutVar + '''');
因为firstname是字符型的,所以你要加引号。
㈧ 带有变量的sql语句怎么写
字符串拼接,最后使用SP_EXECUTESQL执行
具本你网络查下这个过程的用法。
㈨ Python mysqldb执行带@局部变量的sql
任何应用都离不开数据,所以在学习python的时候,当然也要学习一个如何用python操作数据库了。MySQLdb就是python对mysql数据库操作的模块。官方Introction : MySQLdb is an thread-compatible interface to the popular MySQL database server that provides the Python database API. 它其实相当于翻译了对应C的接口。
使用这种数据库接口大多是就是执行连接数据库->执行query->提取数据->关闭连接 这几个步骤。MySQLdb提供比较关键的对象,分别是Connection、Cursor、Result。具体使用步骤很简单先不写了,先写一些个人认为比较重要、值得注意的地方。
1、虽然在MySQLdb.Connect(host ,user , passw , db)函数中,我们经常使用的只是这几个参数,但是其实里面还有很多比如字符集、线程安全、ssl等也都是很重要的参数,使用时要身份注意。
2、当使用Connection.query()函数进行query后,connection 对象可以返回两种result,分别是store_result和use_result,store_result 将结果集存回client端,而use_result则是结果集保存在server端,并且维护了一个连接,会占用server资源。此时,不可以进行任何其他的查询。建议使用store_result,除非返回结果集(result set)过大或是无法使用limit的情形。
㈩ SQL 有变量的循环语句的运行条件是什么
有不同的写法
WHILE…CONTINUE…BREAK语句
WHILE<条件表达式>
BEGIN
<命令行或程序块>
[BREAK]
[CONTINUE]
[命令行或程序块]
END
WHILE语句在设置的条件为真时会重复执行命令行或程序块。CONTINUE语句可以让程序跳过CONTINUE语句之后的语句,回到WHILE循环的第一行。BREAK语句则让程序完全跳出循环,结束WHILE循环的执行。WHILE语句也可以嵌套使用。