2013-11-15 21 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 
相关问题