sql 查询数据库中多个表中指定料号的行数据。

zxdpxl 2015-09-14 11:21:20
我在SQL中创建了一个数据库(ISOMM),这个数据库中有很多表,它们的名字是USB1th、USB2th、USB3th........USB45th,还有一个USBDownloadlist的表。以上这些表的格式、数据类型都是一样的。这些表中有料号、物料类型、货运单号等等信息。要查询的数据都在USB1th、USB2th、USB3th........USB45th和USBDownloadlist表中,我想通过料号(比如:10000-B22)查询到料号所在行数据。这个应该怎么操作,哪位大神帮帮忙,我先谢谢了。
...全文
134 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Haytor 2015-09-21
建议你建个视图把你需要查询的表UNION ALL,这样以后就查这个视图就可以了。
回复
zxdpxl 2015-09-21
引用 1 楼 qq_18219519 的回复:
你说的太笼统了,如果数据库比较小,可以试试下面这个存储过程
CREATE PROCEDURE [dbo].[SP_FindValueInDB]
(
    @value VARCHAR(1024)
)        
AS
BEGIN

SET NOCOUNT ON;
DECLARE @sql VARCHAR(1024) 
DECLARE @table VARCHAR(64) 
DECLARE @column VARCHAR(64) 

CREATE TABLE #t ( 
    tablename VARCHAR(64), 
    columnname VARCHAR(64) 
) 

DECLARE TABLES CURSOR 
FOR 

    SELECT o.name, c.name 
    FROM syscolumns c 
    INNER JOIN sysobjects o ON c.id = o.id 
    WHERE o.type = 'U' AND c.xtype IN (167, 175, 231, 239) 
    ORDER BY o.name, c.name 

OPEN TABLES 

FETCH NEXT FROM TABLES 
INTO @table, @column 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sql = 'IF EXISTS(SELECT NULL FROM [' + @table + '] ' 
    SET @sql = @sql + 'WHERE RTRIM(LTRIM([' + @column + '])) LIKE ''%' + @value + '%'') ' 
    SET @sql = @sql + 'INSERT INTO #t VALUES (''' + @table + ''', ''' 
    SET @sql = @sql + @column + ''')' 

    EXEC(@sql) 

    FETCH NEXT FROM TABLES 
    INTO @table, @column 
END 

CLOSE TABLES 
DEALLOCATE TABLES 

SELECT * 
FROM #t 

DROP TABLE #t 


End


--下面是执行语句,先创建好存储过程后再执行,引号里面填写所需查找内容
--EXEC [SP_FindValueInDB] '张三'
对于您的这个存储过程我非常需要。小弟我刚刚接触SQL Server还不是很懂得写存储过程。 我是想通过料号“100000-B22”查询到这个料号在那个表中、它的光盘大小(ISO_GB),MD5(Check_MD5)、光盘类型(ISO_Type)、MD5校验结果(Result)。想实现这个功能应该如何创建存储过程?PS:我的这个数据库比较小。只有10MB左右。
回复
zxdpxl 2015-09-21
对于您的这个存储过程我非常需要。小弟我刚刚接触SQL Server还不是很懂得写存储过程。 我是想通过料号“100000-B22”查询到这个料号在那个表中、它的光盘大小(ISO_GB),MD5(Check_MD5)、光盘类型(ISO_Type)、MD5校验结果(Result)。想实现这个功能应该如何创建存储过程?PS:我的这个数据库比较小。只有10MB左右。
回复
zxdpxl 2015-09-21
非常感谢以上两位网友的答案。
回复
返回结果以后自己查就行了,比如返回USB45th 那么就
select ISO_GB,Check_MD5,ISO_Type,Result from USB45th 
根据实际填写from 后的表名
回复
Tiger_Zhao 2015-09-14
SELECT * FROM usb1th WHERE 料号='10000-B22'
UNION ALL
SELECT * FROM usb2th WHERE 料号='10000-B22'
UNION ALL
...
SELECT * FROM usb45th WHERE 料号='10000-B22'
UNION ALL
SELECT * FROM USBDownloadlist WHERE 料号='10000-B22'
回复
你说的太笼统了,如果数据库比较小,可以试试下面这个存储过程
CREATE PROCEDURE [dbo].[SP_FindValueInDB]
(
    @value VARCHAR(1024)
)        
AS
BEGIN

SET NOCOUNT ON;
DECLARE @sql VARCHAR(1024) 
DECLARE @table VARCHAR(64) 
DECLARE @column VARCHAR(64) 

CREATE TABLE #t ( 
    tablename VARCHAR(64), 
    columnname VARCHAR(64) 
) 

DECLARE TABLES CURSOR 
FOR 

    SELECT o.name, c.name 
    FROM syscolumns c 
    INNER JOIN sysobjects o ON c.id = o.id 
    WHERE o.type = 'U' AND c.xtype IN (167, 175, 231, 239) 
    ORDER BY o.name, c.name 

OPEN TABLES 

FETCH NEXT FROM TABLES 
INTO @table, @column 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sql = 'IF EXISTS(SELECT NULL FROM [' + @table + '] ' 
    SET @sql = @sql + 'WHERE RTRIM(LTRIM([' + @column + '])) LIKE ''%' + @value + '%'') ' 
    SET @sql = @sql + 'INSERT INTO #t VALUES (''' + @table + ''', ''' 
    SET @sql = @sql + @column + ''')' 

    EXEC(@sql) 

    FETCH NEXT FROM TABLES 
    INTO @table, @column 
END 

CLOSE TABLES 
DEALLOCATE TABLES 

SELECT * 
FROM #t 

DROP TABLE #t 


End


--下面是执行语句,先创建好存储过程后再执行,引号里面填写所需查找内容
--EXEC [SP_FindValueInDB] '张三'
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-09-14 11:21
社区公告
暂无公告