更新 - 请注意,我正在努力通过SQL 2012解决方案解决此挑战。
我正在尝试制作一个SQL拼图,我确信它有一个简单的解决方案但是我现在正在转动它。我正在尝试使用gridview中的一个字段,我需要在第一次输入一个长文件名,并在更新过程中删除文件名左侧的六个字符。已经输入了gridview中的其余字段,因此这不是INSERT方案,而是UPDATE操作。我已经找到了基本命令(LEFT),但我需要做的是让页面背后的代码(我假设使用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>
输出代码看起来像这样......
行数据新数据
.................................................. .................................................. .........................
1 131024_000000-A_blah_de_blah_1of12.pdf 131024
2 131024_000000-A_blah_de_blah_1of12.rtf
3 131024_000000-A_blah_de_blah_2of12.pdf
4 131024_000000-A_blah_de_blah_2of12.rtf
5 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(data) 从dbo.left_test中选择LEFT(data,6)
由于我没有使用过这种情况,因此我没有最简单的想法如何在此gridview中加入更新语句并利用左命令(如果这是必需的)。我是否在更新gridview时创建存储过程并调用它,还是在SQL UPDATE代码中间将代码添加到ASP页面?
如果此处需要更多信息,请告知我们。
答案 0 :(得分:1)
对于UPDATE
命令,只需使用.Substring()
方法将六个字符的字符串发送到在代码中构建SQL语句的逻辑,如下所示:
var longFilename = "131114_blahblahblahblahblah_moreblahblahblahblah.doc";
var sixCharName = longFilename.Substring(0, 6);
现在将sixCharName
发送到构建UPDATE
SQL语句的逻辑。
答案 1 :(得分:1)
此部分返回要在一条记录中更新的多条记录,这些记录失败:
(SELECT LEFT(Data,6)
FROM [dbo].[left_test])
您应该将SQL更改为:
UPDATE [dbo].[left_test]
SET [new_data] = LEFT(Data,6)
WHERE [data] = @data;
GO
<强>解释强>
此子查询
SELECT LEFT(Data,6) FROM [dbo].[left_test])
返回多条记录,所有记录中的前6个字符。但是你只需要具有相同id的那个。你可以这样修理它:
SELECT LEFT(数据,6) 来自[dbo]。[left_test] WHERE [data] = @data
由于您要更新同一行,因此子查询:
SELECT LEFT(Data,6)
FROM [dbo].[left_test]
WHERE [data] = @data
与
相同 LEFT(Date, 6)
答案 2 :(得分: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