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遍歷整張表
在資料庫開發過程中,我們經常會碰到要遍歷數據表的情形,一提到遍歷表,我們第一印象可能就想到使用游標,使用游標雖然直觀易懂,但是它不符合面向集合操作的原則,而且性能也比面向集合低。當然,從面向集合操作的角度出發,也有兩種方法可以進行遍歷表的操作,總結起來,遍歷表有下面幾種方法。
使用游標
使用表變數
使用臨時表
-- 需求是,新增一列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
我的需求是:針對HR.Employees表,新增一列fullname,並取值firstname+lastname。
原始效果如下圖。
可以看到,已經達到我們想要的效果了。
使用表變數
因為使用游標存在性能和違背面向集合思想的問題,所以我們有必要用面向集合的思想去找到一種更好的解決方案,下面這種方法是使用表變數的方式實現的,代碼如下。
使用臨時表
臨時表也可以實現表變數的功能,所以我們也可以使用臨時表來實現這個需求,代碼如下。
當然,實現的效果都是一樣的。
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='欄位名'
給分!