2013-11-15 20 views
1

更新 - 請注意,我正努力通過SQL 2012解決方案解決此挑戰。在GridView更新期間刪除字符

我正在試圖找出一個SQL難題,我確信有一個簡單的解決方案,但我現在正在旋轉我的輪子。我試圖在gridview中使用一個字段,我需要首次輸入一個長文件名,並在更新過程中刪除文件名左側的所有六個字符。 GridView中其餘的字段已經被輸入,所以這不是一個INSERT場景,而是一個UPDATE操作。我已經想出了這個(左)的基本命令,但我需要做的是讓頁面後面的代碼(我假設與SQL代碼)以這種格式的文件名:

這是代碼:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1"> 
<Columns> 
<asp:CommandField ShowEditButton="True" /> 
<asp:BoundField DataField="line" HeaderText="Line" SortExpression="line" InsertVisible="False" /> 
<asp:BoundField DataField="data" HeaderText="Data" SortExpression="data" /> 
<asp:BoundField DataField="new_data" HeaderText="New Data" SortExpression="new_data" /> 
<asp:CommandField ShowEditButton="True" /> 
</Columns> 
</asp:GridView> 

輸出的代碼看起來是這樣的......

線                                 數據                                                                                                                             新數據
.............. .................................................. 。 .................................................. ..........
        131024_000000-A_blah_de_blah_1of12.pdf                           131024_000000-A_blah_de_blah_1of12.rtf
        131024_000000-A_blah_de_blah_2of12。PDF
        131024_000000-A_blah_de_blah_2of12.rtf
        131025_000000-A_blah_de_blah_3of12.pdf

等等....

什麼我試圖用做這是爲了通過SQL找到一種方法,將數據列中的文件名稱放在後面,將前六位數字右側的文件名切掉,然後將其寫入「new_data」列。

這是我已經試過:

UPDATE [dbo].[left_test] 
SET [new_data] = 
(SELECT LEFT(Data,6) 
FROM [dbo].[left_test]) 
WHERE [data] = @data; 
GO 

這產生以下錯誤:

Msg 512, Level 16, State 1, Line 2 
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 
The statement has been terminated. 

INSERT INTO dbo.left_test NEW_DATA(數據) SELECT LEFT(數據,6)DBO .left_test

由於我沒有用過這個場景,所以我沒有想到如何在這個GridView中引入更新語句,並利用左邊命令(如果這是需要的話)。我是否創建存儲過程並在Gridview更新時調用它,或者將代碼添加到SQL UPDATE代碼中間的ASP頁面中?

如果需要更多信息,請告訴我。

回答

1

這部分返回多個記錄在一個記錄,這是失敗的更新:

(SELECT LEFT(Data,6) 
FROM [dbo].[left_test]) 

您應該更改SQL到:

UPDATE [dbo].[left_test] 
SET [new_data] = LEFT(Data,6) 
WHERE [data] = @data; 
GO 

說明:

  1. 此子查詢 SELECT LEFT(Data,6) FROM [dbo].[left_test]) 返回多條記錄,所有記錄的前6個字符。但你只需要具有相同ID的那個。你可以這樣修復:

    SELECT LEFT(Data,6) FROM [dbo]。[left_test] WHERE [數據] = @data

  2. 由於要更新同一行,子查詢:

    SELECT LEFT(Data,6) FROM [dbo].[left_test] WHERE [data] = @data

    是相同

    LEFT(Date, 6)

+0

爲了讓我可以學習這一點以備將來參考,你可以在類似的情況下再次解釋我需要記住的東西(理論上的)嗎? –

+0

我在ssms中運行查詢...我會說這是一個常見問題,並且很容易在ssms中找到。 – afzalulh

+0

這個伎倆!當網站允許我(大約6小時後)給予獎勵時,我會給予獎勵。 –

1

對於UPDATE命令只發送六個字符的字符串一個構建使用.Substring()方法在代碼中的SQL語句,像這樣的邏輯:

var longFilename = "131114_blahblahblahblahblah_moreblahblahblahblah.doc"; 
var sixCharName = longFilename.Substring(0, 6); 

現在發送sixCharName一個構建邏輯SQL語句爲UPDATE

+0

這裏的挑戰是,我不能硬編碼的文件名。這將是每個文件的隨機名稱。我可以發誓,有一些方法可以將它放入與Gridview代碼相關的UPDATE命令中。這是不正確的? –

0

您可以創建一個函數,使用_作爲分隔符來查找名稱的第一部分。然後使用查詢作爲子查詢並更新表。

下面是一個例子:

UPDATE TableToUpdate 
SET ColumnInTable = SubQueryWithData.FileName 
From 
(SELECT SUBSTRING(data.columndata, 0 ,CHARINDEX('_', data.ColumnData)) AS FileName 
FROM (SELECT 1 AS RecordID, '123456_789' AS ColumnData 
     ) AS Data) AS SubQueryWithData 
     WHERE TableToUpdate.ID = SubQueryWithData.ID 
相關問題