當前位置:首頁 » 編程語言 » 帶變數的sql執行
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

帶變數的sql執行

發布時間: 2022-06-11 20:36:18

㈠ 帶變數的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語句也可以嵌套使用。