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