当前位置:首页 » 编程语言 » sql遍历所有列
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql遍历所有列

发布时间: 2022-07-08 04:51:26

1. 一个sql问题:怎么遍历所有记录对数值做处理

--大于等于90的分数不变,其余分数加2
updateResult
setScore=Score+(casewhenScore>=90then0else2end);
--如果还有小于60的分数,则再执行一次上面的语句
ifexists(select1fromResultwhereScore<60)
updateResult
setScore=Score+(casewhenScore>=90then0else2end);

2. 如何使用 sql 语句 遍历 数据库里的表

---找出这个表中所有类型为varchar型的字段
---不知道你的str型需要对应哪几种类型,只以varchar型为例,其他类型可以查找systypes
---将所需要的type添加到最后的type筛选语句中
select t2.name from
(
---找到主键为aaa,并且与表中aaa字段的外键相对应的表
select b.id
from
(
---找出表1中aaa外键所对应的主表和主键
select rkeyid,rkey
from
(
---找出表1中的所有外键
select a.id,b.* from sysobjects a inner join sysforeignkeys b
on a.id=b.fkeyid
where xtype='U' and name='表1'
)c
inner join
(
---找出aaa字段所在的所有表
select id from syscolumns
where name='aaa'
)d
on c.id=d.id
)a
inner join
(
---找出aaa字段所在的所有表
select id from syscolumns
where name='aaa'
)b
on a.rkeyid=b.id
)t1
inner join syscolumns t2
on t1.id=t2.id
where t2.type=39

回答修改:
根据需求,修改如下
declare @name varchar(255)
---找出主表的名字
set @name=
(select t2.name from
(---找出SampleDetails中的lngYyGlAID外键所对应的主表
---有可能SampleDetails中不只有一个外键
---如果确定只有一个外键,不用和d相交
select rkeyid
from
(
---找出SampleDetails中的所有外键
select a.id,b.* from sysobjects a inner join sysforeignkeys b
on a.id=b.fkeyid
where xtype='U' and name='SampleDetails'
)c
inner join
(
---找出lngYyGlAID字段所在的所有表
select id from syscolumns
where name='lngYyGlAID'
)d
on c.id=d.id)t1
inner join
sysobjects t2
on t1.rkeyid=t2.id)

---从主表中查出strcode字段的所有信息
declare @sql varchar(255)
set @sql='select strCode from '+@name
exec(@sql)

3. SQL遍历数据库,代码语句解释

这是一存储过程,
这过程是为了查到表中的字段名类似@str的所有表
如果存在,刚输出select [fieldname] from [tablename]
if exists() --如果结果集不为空
print--则输出 select [fieldname] from [tablename]
a.xusertype是字段类型,
具体可以下语句查询select * from systypes where xtype in (175,239,231,167,56,60,108,106)
a 表为syscolumns 是系统字段表,存着当前数据库所有对象的字段名
b 表为sysobjects 是系统对象表,存着当前数据库所有的对象(表,视图,过程,索引,关健字,约束等)
xtype='U'是用户表
a.status>=0这个条件是没有用的,MSSQL 系统字段表的status都是>=0的.

整个过程核心为一个游标cursor
select s=''
from syscolumns a
join sysojbects b on a.id = b.id
where....
open cursor
fetch --读到@S
while --开始循环
execute @S
fetch
end
释放 cursor
你的问题是b.name无效? 那是有效的.b-->sysobjects

其实这个可以写得简单点不用写得这么复杂.
可以这么写:
create procere procSelect (@str varchar(100))
as
select 'select ' + A.Name + ' from ' + B.Name
from syscolumns A
left join sysobjects B on A.id = B.id
where B.xtype = 'u' and A.Name like '%' + @str + '%'
and A.xusertype in (175,239,231,167,56,60,108,106)

4. SQL遍历某行中的所有列,并根据列中值的情况来进行统计(不使用游标)。

select (case when C1 is null then 1 else 0 end )+ (case when C2 is null then 1 else 0 end ) + (case when C3 is null then 1 else 0 end ) + (case when C4 is null then 1 else 0 end ) + (case when C5 is null then 1 else 0 end ) from T

5. sql 如何查询表的第三列,或者说如何遍历判断一个表的列。

这个问题很简单了 肯定有了 给你一个语句 你可以在where里 加上任何一个表名 如果不加就是查询整个数据库里面的表 和游标 结合这个语句 就解决了楼主的问题
不明白的随时来问我 祝楼主学习愉快
select a.name 表名,b.name 列名 from sysobjects a join syscolumns b on a.id=b.id
where a.type='u'

6. 如何遍历所有表的所有字段来查询数据

CREATEPROCsp_ValueSearch
@valuesql_variant,--要搜索的数据
@precisionbit=1--1=仅根据sql_variant中的数据类型查找对应类型的数据列.<>1,查询兼容的所有列,字符数据使用like匹配
AS
SETNOCOUNTON
IF@valueISNULLRETURN
--数据类型处理
SELECTxtypeINTO#tFROMsystypes
WHEREname=SQL_VARIANT_PROPERTY(@value,N'BaseType')
--扩展数据类型及查询处理语句
DECLARE@sqlnvarchar(4000),@sql1nvarchar(4000)
IF@precision=1
SET@sql=CASESQL_VARIANT_PROPERTY(@value,N'BaseType')
WHENN'text'THENN'LIKEN''%''+CAST(@valueasvarchar(8000))+''%'''
WHENN'ntext'THENN'LIKE''%''+CAST(@valueasnvarchar(4000))+''%'''
ELSEN'=@value'END
ELSE
BEGIN
SET@sql=CAST(SQL_VARIANT_PROPERTY(@value,N'BaseType')assysname)
IF@sqlLIKEN'%char'or@sqlLIKEN'%text'
BEGIN
INSERT#tSELECTxtypeFROMsystypes
WHEREnameLIKEN'%char'ornameLIKEN'%text'
SELECT@sql=N'LIKEN''%''+CAST(@valueas'
+CASE
WHENLEFT(@sql,1)=N'n'THEN'nvarchar(4000)'
ELSE'varchar(8000)'END
+N')+N''%'''
END
ELSEIF@sqlLIKEN'%datetime'
BEGIN
INSERT#tSELECTxtypeFROMsystypes
WHEREnameLIKEN'%datetime'
SET@sql=N'=@value'
END
ELSEIF@sqlLIKEN'%int'
OR@sqlLIKEN'%money'
OR@sqlIN(N'real',N'float',N'decimal',N'numeric')
BEGIN
INSERT#tSELECTxtypeFROMsystypes
WHEREnameLIKEN'%int'
ORnameLIKEN'%money'
ORnameIN(N'real',N'float',N'decimal')
SET@sql=N'=@value'
END
ELSE
SET@sql=N'=@value'
END
--保存结果的临时表
CREATETABLE#(TableNamesysname,FieldNamesysname,Typesysname,SQLnvarchar(4000))
DECLAREtbCURSORLOCAL
FOR
SELECTN'SELECT*FROM'
+QUOTENAME(USER_NAME(o.uid))
+N'.'+QUOTENAME(o.name)
+N'WHERE'+QUOTENAME(c.name)
+@sql,
N'INSERT#VALUES(N'+QUOTENAME(o.name,N'''')
+N',N'+QUOTENAME(c.name,N'''')
+N',N'+QUOTENAME(QUOTENAME(t.name)+CASE
WHENt.nameIN(N'decimal',N'numeric')
THENN'('+CAST(c.precasvarchar)+N','+CAST(c.scaleasvarchar)+N')'
WHENt.name=N'float'
ORt.namelikeN'%char'
ORt.namelikeN'%binary'
THENN'('+CAST(c.precasvarchar)+N')'
ELSEN''END,N'''')
+N',@sql)'
FROMsysobjectso,syscolumnsc,systypest,#ttt
WHEREo.id=c.id
ANDc.xusertype=t.xusertype
ANDt.xtype=tt.xtype
ANDOBJECTPROPERTY(o.id,N'IsUserTable')=1
OPENtb
FETCHtbINTO@sql,@sql1
WHILE@@FETCH_STATUS=0
BEGIN
SET@sql1=N'IFEXISTS('+@sql+N')'+@sql1
EXECsp_executesql@sql1,N'@valuesql_variant,@sqlnvarchar(4000)',@value,@sql
FETCHtbINTO@sql,@sql1
END
CLOSEtb
DEALLOCATEtb
SELECT*FROM#
execsp_ValueSearch'要搜索的值',1--1或不输入(即默认值1)精确匹配
execsp_ValueSearch'要搜索的值',0--不等于1,模糊匹配

7. 如何用SQL遍历整张表

在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易懂,但是它不符合面向集合操作的原则,而且性能也比面向集合低。当然,从面向集合操作的角度出发,也有两种方法可以进行遍历表的操作,总结起来,遍历表有下面几种方法。

  • 使用游标

  • 使用表变量

  • 使用临时表

  • 我的需求是:针对HR.Employees表,新增一列fullname,并取值firstname+lastname。

  • -- 需求是,新增一列fullname,取值firstname+lastnameALTER TABLE HR.Employees ADD fullname NVARCHAR(30) NULL;GO


  • 原始效果如下图。

    可以看到,已经达到我们想要的效果了。

    使用表变量

    因为使用游标存在性能和违背面向集合思想的问题,所以我们有必要用面向集合的思想去找到一种更好的解决方案,下面这种方法是使用表变量的方式实现的,代码如下。

  • 1 -- 方法2:使用表变量

  • 2 -- 声明表变量

  • 3 DECLARE @temp TABLE

  • 4 (

  • 5 empid INT,

  • 6 firstname NVARCHAR(10),

  • 7 lastname NVARCHAR(20)

  • 8 );

  • 9

  • 10 -- 将源表中的数据插入到表变量中

  • 11 INSERT INTO @temp(empid, firstname, lastname )

  • 12 SELECT empid,firstname,lastname FROM HR.Employees

  • 13 ORDER BY empid;

  • 14

  • 15 -- 声明变量

  • 16 DECLARE

  • 17 @empid AS INT,

  • 18 @firstname AS NVARCHAR(10),

  • 19 @lastname AS NVARCHAR(20);

  • 20

  • 21 WHILE EXISTS(SELECT empid FROM @temp)

  • 22 BEGIN

  • 23 -- 也可以使用top 1

  • 24 SET ROWCOUNT 1

  • 25 SELECT @empid= empid, @firstname= firstname,@lastname= lastname FROM @temp;

  • 26 UPDATE HR.Employees SET fullname= @firstname+' '+@lastname WHERE empid=@empid;

  • 27 SET ROWCOUNT 0

  • 28

  • 29 DELETE FROM @temp WHERE empid=@empid;

  • 30 END

  • 使用临时表

    临时表也可以实现表变量的功能,所以我们也可以使用临时表来实现这个需求,代码如下。

  • 1 -- 方法3:使用临时表

  • 2 -- 创建临时表

  • 3 IF OBJECT_ID('tempdb.dbo.#tempemployees','U') IS NOT NULL DROP TABLE dbo.#tempemployees;

  • 4 GO

  • 5

  • 6 SELECT empid,firstname,lastname

  • 7 INTO dbo.#tempemployees

  • 8 FROM HR.Employees

  • 9 ORDER BY empid;

  • 10

  • 11 --SELECT * FROM dbo.#tempemployees;

  • 12

  • 13 -- 声明变量

  • 14 DECLARE

  • 15 @empid AS INT,

  • 16 @firstname AS NVARCHAR(10),

  • 17 @lastname AS NVARCHAR(20);

  • 18

  • 19 WHILE EXISTS(SELECT empid FROM dbo.#tempemployees)

  • 20 BEGIN

  • 21 -- 也可以使用top 1

  • 22 SET ROWCOUNT 1

  • 23 SELECT @empid= empid, @firstname= firstname,@lastname= lastname FROM dbo.#tempemployees;

  • 24 UPDATE HR.Employees SET fullname= @firstname+' '+@lastname WHERE empid=@empid;

  • 25 SET ROWCOUNT 0

  • 26

  • 27 DELETE FROM dbo.#tempemployees WHERE empid=@empid;

  • 28 END

  • 当然,实现的效果都是一样的。

8. SQL如何用语句进行查询结果遍历

1.先找到 存储 外键约束或者所有约束信息的表或者数据字典 假设为user_re表
2.然后再DESC 查看他有那些字段
3.再找里面相应的字段
a.约束所在表(假设字段为fk_table)
b.外键的话应该有
c.表的字段(fk_col)参照表(ref_table)和参照表的字段(ref_table.col)
这些信息肯定都有了

然后按你的要求就是
select ref_table from user_re
where fk_table = 'T1' and fk_col = 'AAA' and ref_table.col = 'AAA';

那么得到的ref_table列就是你所要找的表了!~
你自己要做的就是去查找相应的数据字典,而且可能信息存在几个表中,那么可能还设计到表的连接。

9. 在SQLSERVER数据库表中遍历列,遍历的列的字段包含在另一个表的某列中

有游标循环即可。
decalre @fieldName varchar(128)
declare @sql varchar(max)
set @sql='select row_number() '

declare MyCur cursor for select ID form table1

open

fetch next from MyCur into @FieldName
while @@fetch_status = 0
begin
@sql=@sql +','+@FieldName

fetch next from MyCur into @FieldName
end
set @sql =@sql +' from tablename'

exec(@sql)
--关闭释放游标

10. sql server 某数据库所有表中数据的遍历

--T_Sql查询
select a.Name as tableName from sysobjects a inner join syscolumns b on a.ID=b.ID
where b.Name='字段名'

给分!