Ⅰ sql 一行数据改成多行
您的方法(不建视图):
SELECT TOP 100 PERCENT *
FROM (SELECT *, SUBSTRING(Picture, 32, 30) AS PICTUREV FROM dbo.procts
WHERE (SUBSTRING(Picture, 32, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 63, 30) AS PICTUREV FROM dbo.procts
WHERE (SUBSTRING(PictureB, 63, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 94, 30) AS PICTUREV FROM dbo.procts
WHERE (SUBSTRING(PictureB, 94, 30) <> '')
) DERIVEDTBL
ORDER BY ...
我觉得您的子串应该是这样计算的,:
SUBSTRING(Picture, 0*31+1,30)
SUBSTRING(Picture, 1*31+1,30)
SUBSTRING(Picture, 2*31+1,30)
SUBSTRING(Picture, 3*31+1,30)
所以,在语句中这样写也会更好写,更容易理解,和更不容易出错。也不影响效率。
你的方法除了多余建了那么多视图,应该说是不错的方法了,但是实现不了不等长文件名按分隔符分离字串。
如果是分隔符为字串分段,您就必须要用我的自定义函数加我的语句。
如果是您写的那样,是固定长度的字串分段,那么就完全用你的方法,便是稍作改动,不用建中间视图
另外,您喜欢视图的话,可以建一个视图:
create view DERIVEDTBL
as
create view
SELECT *, SUBSTRING(Picture, 0*31+1,30) AS PICTUREV FROM dbo.procts WHERE (SUBSTRING(Picture, 32, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 1*31+1,30, 30) AS PICTUREV FROM dbo.procts WHERE (SUBSTRING(PictureB, 63, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 2*31+1,30, 30) AS PICTUREV FROM dbo.procts WHERE (SUBSTRING(PictureB, 94, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 3*31+1,30, 30) AS PICTUREV FROM dbo.procts WHERE (SUBSTRING(PictureB, 94, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 4*31+1,30, 30) AS PICTUREV FROM dbo.procts WHERE (SUBSTRING(PictureB, 94, 30) <> '')
union
SELECT *, SUBSTRING(Picture, 5*31+1,30, 30) AS PICTUREV FROM dbo.procts WHERE (SUBSTRING(PictureB, 94, 30) <> '')
--....向下任意延伸,只要改SUBSTRING中的序号就行了。
go
调用时这样就行了:
SELECT TOP N *
FROM DERIVEDTBL
ORDER BY ...
=================
一句解决问题,这样:
SELECT ID,TITLE,DBO.MYSPLIT(PICTURES,1,'|') AS PICTURE,1 AS SN from TABLENAME
UNION
SELECT ID,TITLE,DBO.MYSPLIT(PICTURES,2,'|') AS PICTURE,2 AS SN from TABLENAME
UNION
SELECT ID,TITLE,DBO.MYSPLIT(PICTURES,3,'|') AS PICTURE,3 AS SN from TABLENAME
UNION
SELECT ID,TITLE,DBO.MYSPLIT(PICTURES,4,'|') AS PICTURE,4 AS SN from TABLENAME
UNION
SELECT ID,TITLE,DBO.MYSPLIT(PICTURES,5,'|') AS PICTURE,5 AS SN from TABLENAME
UNION
SELECT ID,TITLE,DBO.MYSPLIT(PICTURES,6,'|') AS PICTURE,6 AS SN from TABLENAME
-- . . . . . .
ORDER BY ID,TITLE,SN
还有,您的这个函数求等长字串,不知道为什么没有首字串?
SUBSTRING(Picture, 32, 30)
就是这个个?
SUBSTRING(Picture, 1, 30)
===================
这里只给您写了6行,来满足您每ID最多6张图片的要求。写多少行都可以,即每ID最大图片数为6张。您可以写100行,1000行都行!
这里还给您多加了以个序号字段(SN),以保证图片顺序与原排列相同。如果不需要您可以去掉他。
下面的函数是一个非常有用的自定义数,是用来提取字串中某一部份的,请您执行一下,把他建立到您的数据库中,今后对您的编程会提供很大的方便。当然,本例所用的函数就是这个函数。
create FUNCTION mysplit--将以某分隔符分段的字串,按指定的顺序号提取子串
(@str nvarchar(2000),--源字串
@sn int, --提取序号
@Deli varchar(1) --分隔符
)
RETURNS varchar(100)
AS
BEGIN
declare @first int,@last int,@result varchar(1000),@sn0 int
select @sn0=0,@first=0,@LAST=1,@str=@str+REPLICATE(@DELI,1)
while @sn0!=@sn
begin
select @sn0=@sn0+1,@first=@LAST,@last=charindex(@DELI,@str,@LAST)+1
end
if @last-@first-1<0
set @result=''
else
SET @RESULT=SUBSTRING(@str,@FIRST,@LAST-@FIRST-1)
RETURN ( @RESULT )
END
GO
Ⅱ sql数据库修改多条语句怎么写
最简单的方法。把多条SQL拼接起来;
在数据库管理工具中你会发现:书写以下4条SQL ,全部选中执行,是可以执行的。
Update table1 set a=2 where id=1
Update table2 set a=2 where id=1
Update table3 set a=2 where id=1
Update table4 set a=2 where id=1
那么,后台程序处理的时候,也可以借用类似的方式来处理。
C#为例;建立 StringBuding sb;
往SB里依次写要处理的SQL
SB.Append("Update table1 set a=2 where id=1");
SB.Append("Update table2 set a=2 where id=1");
SB.Append("Update table3 set a=2 where id=1");
SB.Append("Update table4 set a=2 where id=1");
然后 将SB转换成字符串:sql=SB.Tostring();
其它的就只能写存储过程来处理了。
Ⅲ SQL如何同时改多行的数据,比如~
用回圈么
declare
@a int
@b int
set @a=1
select @b=max(id) from table
while(@a<=@b)
begin
select id,栏位1,@a+99 from table
@a=@a+1
end
id 栏位1
1 XXX 100
2 XXX 101
3 XXX 102
Ⅳ sql 多行删除多行修改多行插入
简单就是高性能.
删除多行: delete from 表名 where id in(1,2,3,4)
更新多行: update 表名 set 字段1=更新值1,字段2=更新值2,字段3=更新值3 where id = 1
新增多行: insert into 表名(列名1,列名2) values(字段名1,字段名2);insert into 表名(列名1,列名2) values(字段名1,字段名2);多条语句用分号隔开.
Ⅳ sql编辑1000行怎样修改成编辑后200行
你好,具体步骤如下:
打开你的sql serve。
选择工具中的选项这一选项。
选中其中的命令。
这里就可以改你要一次编辑的行数了,比如改成了200之类的。
Ⅵ SQL如何同时改多行的数据,比如~
加条件噻,只要条件满足都能修改,或者修改全部就不加条件,具体啥意思没看懂、
Ⅶ SQL数据库 怎么将一行数据变成多行
用一个循环。
先用参数取到到底要变成多少行,和单价
declare
@t
int
declare
@sal
nvarchar(8)
根据需求或实际情况将应变为多少行这个烤取给变量@t,单价取给@sal
设置循环的起始数值
declare
@i
int
set
@i=1
开始循环
while(@i<=@t)
begin
--将单行的数据插入需要的表
insert
into(……)
values(……)
--循环参数自增
set
@i=@i+1
end
Ⅷ 在sql sever 中怎么修改表中的多行列
一、建立Access数据库连接的常用方法
在ASP中建立对Access数据库连接的一般格式如下:
它的各步骤及参数意义如下:
第一行程序:利用Server对象的MapPath函数,取得要打开数据库的完整的文件路径,并存储在变量DbPath中。这其中,数据库名是我们需要指定的参数,应该用我们要打开的数据库的实际名称替代。如果数据库名是直接作为常量出现,要用引号将其括起来,并且不能丢掉扩展名。例如数据库是Test.mdb,则该行程序成为:DbPath=Server.MapPath(“Test.mdb”)。
第二行程序:建立一个ADO对象集中的Connection对象,也即连接对象。这是建立数据库连接的初始步骤。执行这行程序后,Conn成为一个连接对象。
第三行程序:利用连接对象Conn的Open方法打开一个指定的数据库。因为我们要打开的是Access数据库,所以要指定ODBC驱动程序参数,表示要透过Access的ODBC驱动程序来访问数据库:driver=;。另一个参数dbq= & DbPath,运算后等效于dbq=Server.MapPath(数据库名) ,是利用了第一行的Server.MapPath(数据库名)函数,用来指定要打开的数据库文件。到这里,就已经打开了数据库名指定的数据库。如果数据库名是“test.mdb”,则打开Access数据库Test.mdb。在这一行里指定的参数,要严格按照格式原样写出,不能省略或改动,也没有可变参数。
第四行程序:建立一个ADO对象集中的Recordset对象,以便利用Recordset对象操作数据库(当然,这只是对数据库操作的多种方式之一)。执行这行后,rs就成为一个Recordset对象。
第五行程序:利用rs对象的Open方法打开数据库中的数据表。这其中有四个参数,其意义如下:
数据表名或SQL指令串:在这个参数里指定要打开的数据库内的数据表名称,或者是用SQL的Select指令串确定的数据表的指定范围数据,例如,数据库Test.mdb中有数据表Number,则该参数成为“Number”,注意引号不能丢;若想打开数据表Number中xh字段值小于90的数据记录,则该参数可能成为如下的形式:
“Select * From Number Where xh < 90”。
Connection对象:指定已经打开的数据库的Connection对象,在这里固定是Conn,注意无须引号的。
Recordset类型:表示打开数据表的方式,有四种选择。数字0表示只读方式,且当前记录只能下移;数字1表示可读写方式,当前记录可自由上下移动,但不能及时看到别的用户建立的新记录,除非重新启动;数字2表示可读写方式,当前记录可自由移动,而且可以及时看到别的用户增加的新记录;数字3表示只读方式,但当前记录可以自由移动。一般选择2为好,除非为了禁止数据被修改。
锁定类型:这个参数指定数据库的锁定功能。因为网络上的数据库都是多用户的,很可能同时有多个用户在操作数据库。为了避免错误,让同一时间只可能有一个用户修改数据,就要用锁定功能。有四种选择:数字1表示只读方式锁定,用户不能更改数据;数字2表示悲观锁定,当一个用户用rs对象开始修改数据时就锁定数据库,直到用户用rs.Update更新记录后,才解除锁定;数字3表示乐观锁定,只有在数据写入数据库中时候才锁定,不保险,慎用!数字4表示批次乐观锁定,只有在使用rs.UpdateBatch成批更新数据时候才锁定数据记录。属于很少使用的。一般地,使用悲观锁定比较安全,但是效率要低些。
二、使用Recordset对象操作数据
用上面的方法打开数据库,是利用了Recordset对象建立的数据库连接,然后的对数据操作,也要使用该对象。
用rs.open “数据表名”,Conn,2,2 方式打开数据表,就可以方便的对数据进行操作:
常见的操作对象:
rs.addnew :添加一个新记录在数据表末尾。
rs.delete :删除当前记录。
rs.eof :判断是否已过最后记录。
rs.bof :判断是否移过首记录。
rs.update :数据修改生效。
rs(“字段名”):当前记录指定字段的值。
从数据表中提取数据:用x=rs(“字段名”)的格式,提取数据表中当前记录指定字段的值。
向数据表中填入或修改数据:用rs(“字段名”)=数据值或变量的方式,修改当前记录指定字段的值。
三、使用SQL指令操作数据库
在使用SQL指令对数据库进行操作时,要用如下方式打开数据库和操作:
四、使用DSN连接数据库
在以上连接数据库的方式中,都是在程序中指定数据库,指定ODBC驱动程序。如果数据源有变化,就需要修改程序。如果在系统级别上,预先定义好数据源DSN,就可以避免这个麻烦。
在定义DSN的过程中,就已经指定好了数据源需要的ODBC驱动程序,也指定好了数据库文件的实际路径和名字,我们在程序中,只需要引用预先定义的数据源名DSN即可。
设定义好的DSN为test,则打开数据库的方式为:
五、结束语
在ASP程序中,建立数据库的连接和访问数据库,有很多方式和技术细节,在此难以一一详述。实际上,对SQL Server数据库,DBF数据库,文本文件,电子表格文件等,也都可以很方便的打开和访问,与对Access数据库的访问大同小异而已。如果说方便,Access应该是首选。如果考虑安全保密性,SQL数据库更好些。使用系统数据源DSN的方式建立对数据库的连接,具有更大的灵活性,也更简便些。
Ⅸ 如何用SQL语句将数据一行变成多行呢
截断数据,在新增分隔符即可。
放大招
指定索引号,进行数据截取,返回处理后的字符串数组
string str =你的数据
str.substring(你想分的长度)你自己打印一个转换符就好了
Ⅹ sql 如何同时更改一列中的多行值
看你的工具就知道你是MS SQL Server,那么语句如下:
update press set pre_tel = '010'+pre_tel
where 条件。。。。
最好是你另外有一个字段是标识区号的,例如 QH,然后语句为
update press set pre_tel = QH+pre_tel
where 条件。。。。