A. oracle中sql語句如何動態拼接
因為'x'||to_char(sysdate,'dd')=『xxxx』這個條件不滿足,所以查詢不到數據。
'x'||to_char(sysdate,'dd')明顯不等於'xxxx',能查詢到數據就是怪事了。
如果你想查詢到數據,必須保證'x'||to_char(sysdate,'dd')的值等於'xxxx'
就拿今天來說'x'||to_char(sysdate,'dd')的值肯定是x24。
'xxxx'的值是為xxxx,不等於x24。肯定查詢不到數據。
你這個語句就跟
select name from A where 1>2這個語句的效果一樣。
如果你的xxxx表示你表中的一個欄位,比如X1,X2..X31,
如:
select name from A where 'x'||to_char(sysdate,'dd')=x24;
你做關聯的是用你的欄位名,但是判斷取值的是時候,卻是取的x24這一列裡面的值。
如果x24這一列裡面有一列的值是x24,肯定查得出數據,如果沒有,肯定就查不出來,
你先確實有沒得x24這條數據記錄了來。。
B. 拼接SQL語句
sql語句拼接主要操作於條件增加刪除修改或查詢面給介紹條件查詢例:
既拼接sql語句度定用StringBuffer修飾用String
String name=request.getParameter("name");
String address=request.getParemeter("address");
StringBuffer sql = new StringBuffer();
sql.append("select * from Tuser as t where 1=1");
if(name!=null||!"".equals(name)){
sql.append(" and t.name like'%"+name+"%'");
}
if(address!=null||!"".equals(address)){
sql.append(" and t.address like'%"+address+"%'");
}
拼接sql語句說select * from Tuser as t where 1=1定執行面兩根據用戶數據參數選擇執行
我手寫啊沒復制明白明再問我明白給吧嘿嘿!
C. SQL存儲過程使用動態拼接,會不會降低對效率和增加伺服器的負擔
基本可以認為是無差別
就一個拼sql語句的話,字存儲過程中無非就是字元串拼接,根本不佔什麼系統資源
這個你放心大膽的使用吧
而sql語句的效率主要是你自己sql寫的好不好或者用沒用上索引之類的,跟這個拼sql語句關系不大
D. 動態執行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
E. 動態拼接SQL語句
where 1=1; 這個條件始終為True,在不定數量查詢條件情況下,1=1可以很方便的規范語句。
舉個例子,如果做查詢頁面,並且,可查詢的選項有多個,同時,還讓用戶自行選擇並輸入查詢關鍵詞,那麼,按平時的查詢語句的動態構造,就要有多個if進行判斷用戶的輸入
where 1=1 恆成立,因此如果用戶在多條件查詢頁面中,不選擇任何欄位、不輸入任何關鍵詞,那麼,必將返回表中所有數據;如果用戶在頁面中,選擇了部分欄位並且輸入了部分查詢關鍵詞,那麼,就按用戶設置的條件進行查詢。
where 1=1的應用,不是什麼高級的應用,也不是所謂的智能化的構造,僅僅只是為了滿足多條件查詢頁面中不確定的各種因素而採用的一種構造一條正確能運行的動態SQL語句的一種方法。
F. 如何支持動態拼接SQL的參數化查詢求解答
remarkvarchar(100))go--寫入部分測試數據insertintooswica_test_table_1select1,
'oswica',''insertintooswica_test_table_1select2,
'stone',''insertintooswica_test_table_1select3,
'nana',''insertintooswica_test_table_1select4,
'nana',''go--建立存儲過程createprocoswica_proc_querytestdata(@whereSqlnvarchar(max),
@paramNameListnvarchar(max),
@paramValueListnvarchar(max))asbegindeclare@exesqlnvarchar(max)
--生成查詢語句set@exesql='EXECsp_executesqlN'
'select*fromoswica_test_table_1'
+@whereSql+''
',N'''+@paramNameList+''
','
+@paramValueList+''
print@exesqlexec(@exesql)endgo--執行存儲過程execoswica_proc_querytestdataN
'whereid=@idandname=@name',N
'@idint,@namevarchar(50)',N
'@id=1,@name=''oswica'''go--結果
--EXECsp_executesqlN'select*fromoswica_test_table_1whereid=@idandname=@name',N'@idint,@namevarchar(50)',@id=1,@name='oswica'
--idnameremark
-------------------------------------------------------------------------------------------------------------------------------------------------------------------1oswica--說明
--實際上我們不推薦直接在存儲過程中這么使用。因為這里還是存在執行代碼裡面有拼接sql的情況。
--最好的辦法是在程序代碼裡面動態拼接好然後使用參數方式動態的根據實際參數個數傳入參數,已
--實現即能夠兼容參數化查詢又能夠拼接字元串。----建議
--按照上面的說法,我們可以拼接如下sql:
--select*fromoswica_test_table_1whereid=@idandname=@name
--然後按照拼接的參數個數使用SqlCommand的Parameters動態的添加2個參數:@id和@name來達到
--目的。而在編程語言中實現動態添加參數相對比較容易,或者通過實現sqlserver的CLR存儲過程來
--達到這一目的。
G. sql語句拼接
1.拼接欄位
2.拼接佔位符
3.拼接sql
4.全語句拼接
5.來吧展示
H. MyBatis高級篇 - 動態SQL
MyBatis提供了一套動態SQL標簽,協助我們完成 SQL 語句的拼接工作。我們在日常工作中經常需要對 SQL 進行拼接:入參循環遍歷, where 條件拼接時的分隔符處理等等。
本文介紹以下幾個較常用的動態SQL標簽:
我們經常會遇到 where 條件中需要根據是否傳入參數來確定是否添加條件。
為了解決上面所遇到的問題,MyBatis 為我們提供了 <where> 標簽。
<foreach> 用於遍歷輸入參數中集合對象。
我們的 Mapper 文件,在 select 或者是 where 經常會出現重復內容,我們可以把重復的內容抽取為一個 <sql> 片段,需要使用的地方,使用 <include> 標簽就可以引入進來。
I. SQL語句問題動態拼接
請注意一點:
sql中,變數相加,如果其中有一個變數的數據類型是數字型,那麼sql會自動把其他的變數轉換為數字型,然後相加。
通過你的錯誤原因,可以看出,你的代碼中,應該是 @StartIndex 和 @EndIndex 這兩個變數的數據類型是 int型。
修改方式:
把 @StartIndex 和 @EndIndex 分別改成: Cast(@StartIndex as varchar(10)) 和 Cast(@EndIndex as varchar(10))
如果還有其他變數是int型,也參照上邊的方式,強制轉換為字元型就OK了。
J. 求助一個oracle中sql語句動態拼接的問題
MSSQL到ORACLE還是有不小的差距。
如果在MSSQL里,可以這樣:
declare @sql nvarchar(max);
declare @tableName nvarchar(100);
set @sql = 'OPEN PCURSOR FOR
SELECT T.ID as OBJECTID,T.SHAPE.GET_WKT() as COORD
FROM ' + @tableName + ' T
WHERE instr(@OBJIDS,'',''||TO_CHAR(ID)||'','')>0';
sp_execute @sql, @OBJIDS=OBJIDS
(沒用Sql驗證,單詞拼寫可能有錯誤,語法也可能有錯誤)