當前位置:首頁 » 編程語言 » sql遍歷查詢的數據
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql遍歷查詢的數據

發布時間: 2023-08-27 22:33:18

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)

❷ sql語句,sql怎麼循環查詢,把一個list中的所有值當做查詢條件,查詢符合這個list的所有的數據

selectf1fromtable1的結果集做為查詢條件循環查詢。
如:
set@a=selectf1fromtable1
foreach(@a)
{
select*fromtable2
wheref2=@a
}

❸ 如何使用 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)

❹ SQL 如何循環重復查詢同一條記錄

重復的網址的記錄

select 網址欄位
from 表
group by 網址欄位
having count(*)>1

補充問題,如果判斷A表中數據不在B表的對比條件在一個或一個以上,用left join

寫個例子
insert into B(欄位...)
select a.欄位...
from a left join b
on a.欄位1=b.欄位1 and a.欄位2=b.欄位2 ....
where b.欄位1 is null

❺ sql查資料庫中時間最新的一條記錄(查詢資料庫時間sql)

select*,max(create_time)froma

wherecreate_time<="2017-03-2919:30:36"

groupbyuser_id

這句可以理解為將結果集根據user_id分組,每組取time最悶此大一條記錄。螞跡迅這樣就很好的實現了批量查詢最近記錄,並且僅僅需要遍歷一次表,即使在數據量巨大的情況下也可以在很短的時間查出結果。

(5)sql遍歷查詢的數據擴展閱讀:

SQL數據查詢語句

1、語句語法簡單歸納為:

SELECTselect_list[INTOnew_table_name][FROMtable_source]

[WHEREsearch_condition][GROUPBYgroup_by_expression]

[HAVINGsearch_condition][ORDERBYorder_expression[ASC|DESC]]

2、州核WITH子句用於指定臨時命名的公用表達式,在單條語句(SELECT、INSERT、UPDATE、DELETE)的語句執行范圍內定義。

3、LIKE關鍵字

用於模糊查詢,通配符有%、_、[]、[^]

%:後面可以跟零個或多個字元

_:匹配任意單個字元

[]:查詢一定范圍內的單個字元,包括兩端數據

[^]:表示不在一定范圍內的單個字元,包括兩端數據

❻ SQLsever中通過遍歷的方式查找當前庫中所有表裡面的某個值

下面將為您介紹sql遍歷所有表中某項值為已知數的查詢語句寫法,供您參考,如果您對sql遍歷方面感興趣的話,不妨一看,希望對您有所幫助。
CREATE proc Full_Search(@string varchar(50)) as begin declare @tbname varchar(50) declare tbroy cursor for select name from sysobjects where xtype= 'u ' --第一個游標遍歷所有的表 open tbroy fetch next from tbroy into @tbname while @@fetch_status=0 begin declare @colname varchar(50) declare colroy cursor for select name from syscolumns where id=object_id(@tbname) and xtype in ( select xtype from systypes where name in ( 'varchar ', 'nvarchar ', 'char ', 'nchar ') --數據類型為字元型的欄位 ) --第二個游標是第一個游標的嵌套游標,遍歷某個表的所有欄位 open colroy fetch next from colroy into @colname while @@fetch_status=0 begin declare @sql nvarchar(1000),@j int select @sql= 'select @i=count(1) from ' +@tbname + ' where '+ @colname+ ' like '+ '''%'+@string+ '%''' exec sp_executesql @sql,N'@i int output',@i=@j output --輸出滿足條件表的記錄數 if @j> 0 BEGIN select 包含字串的表名=@tbname --exec( 'select distinct '+@colname+' from ' +@tbname + ' where '+ @colname+ ' like '+ '''%'+@string+ '%''') END fetch next from colroy into @colname end close colroy deallocate colroy fetch next from tbroy into @tbname end close tbroy deallocate tbroy end go exec Full_Search '123'

以上就是sql遍歷所有表中某項值為已知數的查詢方法。

❼ 如何用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

  • 當然,實現的效果都是一樣的。