台灣最大程式設計社群網站
線上人數
3684
 
會員總數:245964
討論主題:189547
歡迎您免費加入會員
討論區列表 >> ASP.NET >> SQL語法--判斷要寫入的字串長度,比在DB內的長度短就不寫入的寫法
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
SQL語法--判斷要寫入的字串長度,比在DB內的長度短就不寫入的寫法
價值 : 20 QP  點閱數:5693 回應數:14
樓主

egg
門外漢
0 13
281 12
發送站內信

大家好...
請問如果我要再寫入DB前,先判斷寫入的字串長度是否小於DB內某欄位的字串長度,語法該怎嚜寫呢?
譬如 :
有三個欄位名稱 1.strA 2.strB 3.strC
再寫入DB前,我要判斷寫入的字串長度是否小於strB,
小於的話就不寫入。


搜尋相關Tags的文章: [ SQL語法,判斷長度 ] ,
本篇文章發表於2009-10-23 23:32
1樓
create procedure usp_lencheck (@stra nvarchar(100),@strb nvarchar(100),@strc nvarchar(100))
as
if len(@strb) < len(@stra) and len(@strb) < len(@strc)
begin
insert into table1(stra,strb,strc) values(@stra,@strb,@strc)
print 'insert 了'
end
else
begin
print 'stra或strc小於strb'
end

exec usp_lencheck 'aaaa','bbb','cccc'
本篇文章回覆於2009-10-24 00:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Response.Write(ckecklen("aaaa", "b", "cccc"))
End Sub
Function ckecklen(ByVal stra As String, ByVal strb As String, ByVal strc As String) As String
Dim returnmeg As String = ""
If stra.Trim().Length < strb.Trim().Length Or strc.Trim().Length < strb.Trim().Length Then
returnmeg = "不輸入資料庫"
Else
Dim objconn As SqlConnection = New SqlConnection("Data Source=KENT;Initial Catalog=lyweb;Integrated Security=True")
Dim sql As String = "insert into table1(stra,strb,strc) values(@stra,@strb,@strc)"
Dim cmd As SqlCommand = New SqlCommand(sql, objconn)
cmd.Parameters.AddWithValue("@stra", stra)
cmd.Parameters.AddWithValue("@strb", strb)
cmd.Parameters.AddWithValue("@strc", strc)
Try
objconn.Open()
cmd.ExecuteNonQuery()
returnmeg = "成功輸入"
Catch ex As Exception
returnmeg = ex.Message
Finally
objconn.Close()
End Try
End If
Return returnmeg
End Function
本篇文章回覆於2009-10-24 00:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(checklen("aaaa","bccccccccccccccc","cccccc"));

}
public string checklen(string stra,string strb,string strc)
{
string msg = "";
if (strb.Trim().Length > stra.Trim().Length | strb.Trim().Length > strc.Trim().Length)
{
msg = "沒入資料庫";
}
else
{
SqlConnection sqlconn = new SqlConnection("Data Source=KENT;Initial Catalog=lyweb;Integrated Security=True");
string sql = "insert into table1(stra,strb,strc) values(@stra,@strb,@strc)";
SqlCommand cmd = new SqlCommand(sql, sqlconn);
cmd.Parameters.Add(stra);
cmd.Parameters.Add(strb);
cmd.Parameters.Add(strc);
try
{
sqlconn.Open();
cmd.ExecuteNonQuery();
msg = "ok";
}
catch
{
msg = "false";
}
finally
{
sqlconn.Close();
}
}
return msg;
}
本篇文章回覆於2009-10-24 01:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
不好意思...在下看了老半天....
請問您是要去比對db欄位的長度?還是比對下一個字串的長度?
您寫的程式碼,看起來像是字串a與字串b比對,然後字串b又跟字串c比對?

and...store procedure已經做了一次判斷,button click就不用再做判斷了
button click直接呼叫store procedure,直接傳參數進去就好
反正執行sp時,sp就會判斷,不需要在click事件做這個動作

例如您上面的程式,就做了2次長度判斷的動作,form裡做一次,執行sp時又做了一次

本篇文章回覆於2009-10-24 02:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

egg
檢舉此回應
可能我敘述的不夠清楚...@@
我在補充一下
在存一筆資料前,我想在SQL語法內寫判斷DB內strB欄位的字串長度 與
想存進DB的strB欄位的字串長度,做比較
如果想存進去的字串長度小於 現在DB內strB欄位的字串長度
則不存入

主要是想寫一段SQL語法,讓DB去判斷該不該存就好,程式端只純粹送出這個SQL給DB。
本篇文章回覆於2009-10-24 11:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
for 1樓
抱歉沒看清楚你的敘述

for 4樓
我1樓寫的是用sql procedure的方式
2樓是用asp.net vb的語法寫的
3樓是winform C#的語法

其實作法差不多
要撈出資料庫內strb的長度 你沒指定是第幾比資料 那就第一筆資料好了

select top 1 len(strb) from table1

至於比較與寫入資料庫的方法 123樓都可以參考
希望對你有幫助


本篇文章回覆於2009-10-24 15:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
to.真的有點難...
原來是我搞錯了...我還想說..為什麼要做2次同樣的動作....^^"

不過,我想egg要的應該是
如何得知sql這個table裡的欄位設定長度....這件事
你的做法雖然取出了該欄位裡資料的長度,但若是該欄位設定長度為varchar(30)
但是取出的第一筆資料當初在inser時,該欄位被存入只有10個char長度
那麼你的做法,就會得到只有10的長度
這是資料內容的長度,並不是table該欄位的設定長度

可是如果每次在insert資料時,都要去確認一下該table裡欄位裡的長度
這做法可行,但是也不太對

理論上來說table在資料庫裡的定義當初在create時就應該是固定的,不該變來變去
就算變動table欄位,也不會是常常在變
如果為了欄位經常變動而程式寫成這樣,也會增加程式不必要的效能和網路流量

我有個東西給你參考,egg
http://itgroup.blueshop.com.tw/milienchen/m?n=convew&i=12245
下面這段
SELECT syscolumns.name,syscolumns.colstat,syscolumns.isnullable,syscolumns.length,systypes.name AS xtype FROM syscolumns,systypes WHERE ( systypes.name <> 'sysname' AND systypes.xtype = syscolumns.xtype AND id = @tableID) order by colid
在syscolumns,和systypes 裡,可以找出該欄位裡定義的相關資料...但是呢....要找出你要的指定table和欄位還滿麻煩的
而且如果你的欄位是nvarchar20,其實取出的欄位長度會是40,還得自己去除以2

我不知道是不是還有什麼型態的設定會像nvarchar這樣...
如果egg你有需要,你得自己try出來...

希望egg你要的...不是取出table裡的欄位設定長度...這件事
如果真的你的情況是,table裡的欄位經常變動,其實也會影響sql存取資料的效能,建議別經常變動table欄位設定
本篇文章回覆於2009-10-24 21:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
....還是忍不住再來po一下....我個人的想法....
資料在insert時,sql之所以會顯示錯誤訊息出來
就是好讓程式端能直接得知,insert的資料長度過長這件事
如果在sql裡寫成store procedure去insert資料,並且長度過長時,就不做inser的動作
那程式端就永遠無法得知,自己insert的資料倒底有沒有問題

如果您認為,您也可以在store procrdure回傳資料過長的訊息...
那....
跟sql自己顯示出來的訊息...有差別嗎?
那何必繞這麼大圈,直接在程式裡try catch...把sql回應的錯誤訊息秀出來就是
本篇文章回覆於2009-10-24 22:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

Dreamyi
捐贈 VP 給 Dreamyi 檢舉此回應
如果是要 INSERT 時判斷是否超出資料庫欄位長度的設定,若超出就不寫入的話,我倒有一個簡單的想法,那就是在您的程式執行 SQL 語法的時候,用 Try Catch 包住,這樣不就得了?
本篇文章回覆於2009-10-25 10:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

egg
檢舉此回應
真是對不起大家,我的敘述好像讓大家都搞混了><
我舉個例子好了...
DB裡面有三個欄位,假設都是字串(不管是nvarchar、varchar、nchar等等,都可以)
欄位一 欄位二 欄位三
strA strB strC <--此行是欄位名稱
aaaaa bbbbb ccccc <--此行是DB裡各欄位的字串

我想在程式端,寫一段SQL,當程式要更新DB裡strB欄位的字串時,藉由SQL讓DB去判斷該不該存
譬如 :
程式端要存strB欄位的字串為DDDDDD,因為長度比DB裡strB欄位的字串長,就存進DB裡strB欄位
程式端要存strB欄位的字串為EEE,因為長度比DB裡strB欄位的字串短,就不存進DB裡strB欄位
本篇文章回覆於2009-10-26 14:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
最有價值解答

學海無涯,回頭是岸
檢舉此回應
類似下面的做法再搭配其他條件

本篇文章回覆於2009-10-26 15:08
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

bugryder
檢舉此回應
#11的答案應該是正解了
不過你應該要說明這個TABLE是不是永遠只有一個筆資料
本篇文章回覆於2009-10-26 15:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

egg
檢舉此回應
感謝#11大大的解答!!

for #12大大
#11的寫法我在自己加上一些主Key判斷應該就可以篩選出來要存的資料了
感謝~~~~~><
本篇文章回覆於2009-10-26 15:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

MIS2000 Lab
檢舉此回應
Q : 寫入DB前,先判斷寫入的字串長度
是否小於DB內某欄位的字串長度,語法該怎嚜寫呢?


MS SQL Server有一個函數COL_LENGHT('資料表名稱', '欄位名稱')
請看 https://docs.microsoft.com/zh-tw/sql/t-sql/functions/col-length-transact-sql?view=sql-server-ver15

如果是.NET C#語法請參考
SqlDataReader.GetSchemaTable 方法
ColumnSize 資料欄中值的可能長度上限。
https://docs.microsoft.com/zh-tw/dotnet/api/system.data.sqlclient.sqldatareader.getschematable?view=dotnet-plat-ext-3.1
本篇文章回覆於2020-05-16 19:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.