sql问题急求大神解决急!急!急!

alljkla2008 2018-09-20 10:03:00
SQL2008我只知道一个数值如何通过这个数值查询它在哪个数据库的哪个表和哪个字段。比如我只知道一个名字叫李四的人如何通过这个名字查询到它所在的是哪个数据库的哪个表的哪个字段下。用SQL语句查询
...全文
589 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-09-29
  • 打赏
  • 举报
回复
你先把你最关键的代码贴出来。 你想要啥? xx like N'%金京英%' 还是 xx like N'%金%' and xx like N'%京%' and xx like N'%英%' 其实你能描述出来, 答案就差不多了
alljkla2008 2018-09-29
  • 打赏
  • 举报
回复
@吉普赛的歌,这次用了5个多小时倒是出结果了也正确,但是不是精确的,比如我查找的这个图片,他把有‘金京英’三个字的结果查出来的同时还有喊单个字‘金’或是单个字‘京’,单个字‘英’。只要是包含这几个字其中一个字的都显示出来了,可是我只想要查询这三个字同时含的结果。麻烦您在给看看呗。
吉普赛的歌 2018-09-27
  • 打赏
  • 举报
回复
没有可能就是真的没有了。 如果真的有, 你把上面包含“刘静”的表结构和相关记录的截图贴出来。
alljkla2008 2018-09-27
  • 打赏
  • 举报
回复

执行的结果也是这样的没有,和@二月十六的代码执行出来的效果一样的。麻烦还请两位大神在给看看
吉普赛的歌 2018-09-25
  • 打赏
  • 举报
回复
写了一份全新的版本, 你试下看是否可以:

EXEC sp_MSforeachdb 'if "?" not in (''master'',''tempdb'',''model'',''msdb'',''distribution'') 
BEGIN

DECLARE @search NVARCHAR(200),@sql NVARCHAR(MAX)
SET @search=''李四'' --自己修改
DECLARE @t TABLE (
rid INT IDENTITY(1,1) PRIMARY KEY,
tableName NVARCHAR(200),
columnName NVARCHAR(200),
printInfo AS tablename+''.''+columnName+'' ''
)

INSERT INTO @t(tableName,columnName)
SELECT t.name,c.name FROM sys.tables AS t
INNER JOIN sys.[columns] AS c ON t.[object_id]=c.[object_id]
INNER JOIN sys.types AS tp ON c.system_type_id=tp.system_type_id AND tp.name IN (''text'',''ntext'',''char'',''nchar'',''varchar'',''nvarchar'')

DECLARE @i INT,@imax INT
SELECT @i=1,@imax=MAX(rid) FROM @t
WHILE @i<=@imax
BEGIN
SELECT @sql=''if exists(select 1 from [''+tableName+''] where convert(nvarchar(max),[''+columnName+'']) like ''''%''+@search+''%'''') select ''''''+DB_NAME()+''.''+printInfo+'''''''' FROM @t WHERE rid=@i;

EXEC(@sql);
SET @i=@i+1;
END

END
'

吉普赛的歌 2018-09-25
  • 打赏
  • 举报
回复
引用 9 楼 alljkla2008 的回复:
@吉普赛的歌 这次直接死循环了,服务器直接都卡死了。估计是计算的数据量太大的原因吧,最后只好停止运行了。
这个谈不上什么技巧, 不过就是三重循环:db, table, column 我不想搞那么多, 只循环了数据库, 表列放在了一起。确实不适合数据量大的情况。 #7 版主的要合理一点, 不是一次性搞定, 不过他貌似没有循环数据库。 你自己再改改吧。 或者把 #7 版主的代码, 在所有的数据库上都执行一遍。
alljkla2008 2018-09-25
  • 打赏
  • 举报
回复

@吉普赛的歌 这次直接死循环了,服务器直接都卡死了。估计是计算的数据量太大的原因吧,最后只好停止运行了。
alljkla2008 2018-09-25
  • 打赏
  • 举报
回复
@二月十六 这次到是不报错误了,但是查询后没有结果只提示命令已成功完成。
麻烦在给看看
吉普赛的歌 2018-09-20
  • 打赏
  • 举报
回复
加了限制为 字符串 类型, 你再试下: 李四那里你自己改
--1. 创建全局临时表
IF OBJECT_ID('tempdb..##tmp') IS NOT NULL DROP TABLE ##tmp
CREATE TABLE ##tmp(dbName NVARCHAR(100), tableName NVARCHAR(200),pkName NVARCHAR(100),pkValue NVARCHAR(100))

--2. 构建 db 列表的表变量
DECLARE @db TABLE (
	[dbId] INT IDENTITY(1,1) PRIMARY KEY,
	[dbName] NVARCHAR(MAX)
)
INSERT INTO @db(dbName)
SELECT d.name FROM sys.databases AS d WHERE d.name NOT IN ('master','tempdb','model','msdb')

DECLARE @i INT,@imax INT,@sql NVARCHAR(MAX),@search NVARCHAR(100)
SET @search='李四'  
SELECT @i=MIN([dbId]),@imax=MAX([dbId]) FROM @db;

--3. 遍历所有db , 将数据插入到全局临时表
WHILE @i<=@imax
BEGIN
	SELECT @sql='use '+dbName +'  ' FROM @db WHERE [dbId]=@i;
	SET @sql=@sql+'
DECLARE @sql NVARCHAR(MAX)
SET @sql=(
SELECT ''union all select db_name() as dbName,''''''+t.name+'''''' as tableName, ''''''
	+ (SELECT c.name FROM sys.[columns] AS c WHERE c.[object_id]=t.[object_id] AND c.column_id=1) +'''''' as pkName, ''
	+''[''+ (SELECT c.name FROM sys.[columns] AS c WHERE c.[object_id]=t.[object_id] AND c.column_id=1) +''] as pkValue from ''+t.name 
	+ '' with(nolock) where ''
	+ STUFF((SELECT ''or cast([''+c2.name+''] as nvarchar(max)) = N'''''+@search+''''' '' FROM sys.[columns] AS c2 WHERE c2.[object_id]=t.[object_id]
	        AND EXISTS(
				SELECT 1 FROM sys.types AS p WHERE p.name IN (''text'',''ntext'',''char'',''nchar'',''varchar'',''nvarchar'')
				AND p.system_type_id=c2.system_type_id 
			)
	FOR XML PATH('''')),1,2,'''')+'';'' 
FROM sys.tables AS t FOR XML PATH('''')) 
SET @sql=REPLACE(@sql,'';'',''
'')
SET @sql=STUFF(@sql,1,9,'''')
print @sql

insert into ##tmp(dbName,tableName,pkName,pkValue)
EXEC(@sql)	
'
	EXEC(@sql)
	SET @i=@i+1;
END

--4. 查询最终的全局临时表
SELECT * FROM ##tmp;
alljkla2008 2018-09-20
  • 打赏
  • 举报
回复

这个也不对也查询不到数据呀是错误
alljkla2008 2018-09-20
  • 打赏
  • 举报
回复

是这个错误,上传图片费大劲儿了
alljkla2008 2018-09-20
  • 打赏
  • 举报
回复
不对呢?怎么都是错误呀?求大神在给看看
吉普赛的歌 2018-09-20
  • 打赏
  • 举报
回复
如果没有很大的表,也愿意耐心等待, 可以试下:
--1. 创建全局临时表
IF OBJECT_ID('tempdb..##tmp') IS NOT NULL DROP TABLE ##tmp
CREATE TABLE ##tmp(dbName NVARCHAR(100), tableName NVARCHAR(200),pkName NVARCHAR(100),pkValue NVARCHAR(100))

--2. 构建 db 列表的表变量
DECLARE @db TABLE (
	[dbId] INT IDENTITY(1,1) PRIMARY KEY,
	[dbName] NVARCHAR(MAX)
)
INSERT INTO @db(dbName)
SELECT d.name FROM sys.databases AS d WHERE d.name NOT IN ('master','tempdb','model','msdb')

DECLARE @i INT,@imax INT,@sql NVARCHAR(MAX)
SELECT @i=MIN([dbId]),@imax=MAX([dbId]) FROM @db;

--3. 遍历所有db , 将数据插入到全局临时表
WHILE @i<=@imax
BEGIN
	SELECT @sql='use '+dbName +'  ' FROM @db WHERE [dbId]=@i;
	SET @sql=@sql+'
DECLARE @sql NVARCHAR(MAX)
SET @sql=(
SELECT ''union all select db_name() as dbName,''''''+t.name+'''''' as tableName, ''''''
	+ (SELECT c.name FROM sys.[columns] AS c WHERE c.[object_id]=t.[object_id] AND c.column_id=1) +'''''' as pkName, ''
	+''[''+ (SELECT c.name FROM sys.[columns] AS c WHERE c.[object_id]=t.[object_id] AND c.column_id=1) +''] as pkValue from ''+t.name 
	+ '' with(nolock) where ''
	+ STUFF((SELECT ''or cast([''+c2.name+''] as nvarchar(max)) = N''''李四'''' '' FROM sys.[columns] AS c2 WHERE c2.[object_id]=t.[object_id] FOR XML PATH('''')),1,2,'''')+'';'' 
FROM sys.tables AS t FOR XML PATH('''')) 
SET @sql=REPLACE(@sql,'';'',''
'')
SET @sql=STUFF(@sql,1,9,'''')
print @sql

insert into ##tmp(dbName,tableName,pkName,pkValue)
EXEC(@sql)	
'
	EXEC(@sql)
	SET @i=@i+1;
END

--4. 查询最终的全局临时表
SELECT * FROM ##tmp;
你这个是所有库、所有表、所有列去扫描, 没什么捷径可以走。
二月十六 2018-09-20
  • 打赏
  • 举报
回复
DECLARE @cloumns VARCHAR(40);
DECLARE @tablename VARCHAR(40);
DECLARE @str VARCHAR(40);
DECLARE @counts INT;
DECLARE @sql NVARCHAR(2000);
DECLARE MyCursor CURSOR FOR
SELECT
a.name AS Columns,
b.name AS TableName
FROM
syscolumns a,
sysobjects b,
systypes c
WHERE
a.id = b.id
AND b.type = 'U'
AND a.xtype = c.xtype
AND c.name LIKE '%char%';
SET @str = '值值值值'; --这里写知道的数值
OPEN MyCursor;
FETCH NEXT FROM MyCursor
INTO
@cloumns,
@tablename;
WHILE (@@Fetch_Status = 0)
BEGIN
SET @sql = 'select @tmp_counts=count(*) from ' + @tablename + ' where ' + @cloumns + ' = ''' + @str + '''';
EXECUTE sp_executesql
@sql,
N'@tmp_counts int out',
@counts OUT;
IF @counts > 0
BEGIN
PRINT '表名为:' + @tablename + ',字段名为' + @cloumns;
END;
FETCH NEXT FROM MyCursor
INTO
@cloumns,
@tablename;
END;
CLOSE MyCursor;
DEALLOCATE MyCursor;
二月十六 2018-09-20
  • 打赏
  • 举报
回复
DECLARE @cloumns VARCHAR(40);
DECLARE @tablename VARCHAR(40);
DECLARE @str VARCHAR(40);
DECLARE @counts INT;
DECLARE @sql NVARCHAR(2000);
DECLARE MyCursor CURSOR FOR
SELECT
a.name AS Columns,
b.name AS TableName
FROM
syscolumns a,
sysobjects b,
systypes c
WHERE
a.id = b.id
AND b.type = 'U'
AND a.xtype = c.xtype
AND c.name LIKE '%char%';
SET @str = '值值值值'; --这里写知道的数值
OPEN MyCursor;
FETCH NEXT FROM MyCursor
INTO
@cloumns,
@tablename;
WHILE (@@Fetch_Status = 0)
BEGIN
SET @sql = 'select @counts=count(*) from ' +QUOTENAME(@tablename) + ' where ' + QUOTENAME(@cloumns) + ' = ''' + QUOTENAME(@str) + '''';
EXECUTE sp_executesql
@sql,
N'@counts int out',
@counts OUT;
IF @counts > 0
BEGIN
PRINT '表名为:' + RTRIM(@tablename) + ',字段名为' + RTRIM(@cloumns);
END;
FETCH NEXT FROM MyCursor
INTO
@cloumns,
@tablename;
END;
CLOSE MyCursor;
DEALLOCATE MyCursor;

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧