declare @str varchar(100)
set @str='006252' --精确查找 要搜索的字符串 ,这里改成搜索 数值 就不对了,或者没有结果了!咋办?declare @s varchar(8000)
declare tb cursor local for
select 'if exists(select 1 from ['+b.name+'] where ['+a.name+'] = '''+ @str+''' ) print '' ['+b.name+'].['+a.name+']'''
from syscolumns a join sysobjects b on a.id=b.id
where b.xtype='U' and a.status>=0
and a.xusertype in(175,239,231,167)
open tb
fetch next from tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch next from tb into @s
end
close tb
deallocate tb
===========这样改就没有搜索结果了!==================
declare @str numeric(9,0)--改动一、定义为数值
set @str='281481' --精确查找 要搜索的数值
declare @s varchar(8000)
declare tb cursor local for --改动二、强制转换为字符串!哈哈 小的不懂,请大伙赐教!
select 'if exists(select 1 from ['+b.name+'] where ['+a.name+'] = '''+ cast( @str as varchar)+''' ) print '' ['+b.name+'].['+a.name+']'''
from syscolumns a join sysobjects b on a.id=b.id
where b.xtype='U' and a.status>=0
and a.xusertype in(175,239,231,167)
open tb
fetch next from tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch next from tb into @s
end
close tb
deallocate tb
set @str='006252' --精确查找 要搜索的字符串 ,这里改成搜索 数值 就不对了,或者没有结果了!咋办?declare @s varchar(8000)
declare tb cursor local for
select 'if exists(select 1 from ['+b.name+'] where ['+a.name+'] = '''+ @str+''' ) print '' ['+b.name+'].['+a.name+']'''
from syscolumns a join sysobjects b on a.id=b.id
where b.xtype='U' and a.status>=0
and a.xusertype in(175,239,231,167)
open tb
fetch next from tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch next from tb into @s
end
close tb
deallocate tb
===========这样改就没有搜索结果了!==================
declare @str numeric(9,0)--改动一、定义为数值
set @str='281481' --精确查找 要搜索的数值
declare @s varchar(8000)
declare tb cursor local for --改动二、强制转换为字符串!哈哈 小的不懂,请大伙赐教!
select 'if exists(select 1 from ['+b.name+'] where ['+a.name+'] = '''+ cast( @str as varchar)+''' ) print '' ['+b.name+'].['+a.name+']'''
from syscolumns a join sysobjects b on a.id=b.id
where b.xtype='U' and a.status>=0
and a.xusertype in(175,239,231,167)
open tb
fetch next from tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch next from tb into @s
end
close tb
deallocate tb
我用以下简单的语句模仿了一下,结果一样。楼主仔细检查一下语句吧,或者把表和测试数据发一下declare @str numeric(9,0)
set @str='123'declare @str1 varchar(100)
set @str1='123'
select * from a where name=cast(@str as varchar)
正确的话至少应该输出:[BillIndex].[BillNumberId]
我用上面的存储过程查找字符串是没问题,只要有,就能查到;查数据类型numeric的就不行有没有什么防止空格的tirm函数之类的??建议2楼 可以在自己的数据库随便找个真实值试试;
3楼,去掉2个''号,会报错的。我不太熟悉存储过程,还望大家赐教!
2.既然你的数据列是数值,为什么用要字符串的形式来查呢?直接用数值来查试试?
3.你写的程序,都不是存储过程的格式,如果要写成存储过程,可以类似如下:
create procedure getdata
(@BillNumberId int)
begin
select * from tb where BillNumberId=@BillNumberId
end
go
4.如果要传入表名来查询,可以类似如下:
create procedure getdata
(@BillNumberId int,@tablename)
begin
declare @sql nvarchar(max)
set @str='select * from '+@tablename+' where BillNumberId='+@BillNumberId
exec(@sql)
end
go
@value sql_variant, --要搜索的数据
@precision bit=1 --1=仅根据sql_variant中的数据类型查找对应类型的数据列.<>1,查询兼容的所有列,字符数据使用like匹配
AS
SET NOCOUNT ON
IF @value IS NULL RETURN--数据类型处理
SELECT xtype INTO #t FROM systypes
WHERE name=SQL_VARIANT_PROPERTY(@value,N'BaseType')--扩展数据类型及查询处理语句
DECLARE @sql nvarchar(4000),@sql1 nvarchar(4000)
IF @precision=1
SET @sql=CASE SQL_VARIANT_PROPERTY(@value,N'BaseType')
WHEN N'text' THEN N' LIKE N''%''+CAST(@value as varchar(8000))+''%'''
WHEN N'ntext' THEN N' LIKE ''%''+CAST(@value as nvarchar(4000))+''%'''
ELSE N'=@value' END
ELSE
BEGIN
SET @sql=CAST(SQL_VARIANT_PROPERTY(@value,N'BaseType') as sysname)
IF @sql LIKE N'%char' or @sql LIKE N'%text'
BEGIN
INSERT #t SELECT xtype FROM systypes
WHERE name LIKE N'%char' or name LIKE N'%text'
SELECT @sql=N' LIKE N''%''+CAST(@value as '
+CASE
WHEN LEFT(@sql,1)=N'n' THEN ' nvarchar(4000)'
ELSE 'varchar(8000)' END
+N')+N''%'''
END
ELSE IF @sql LIKE N'%datetime'
BEGIN
INSERT #t SELECT xtype FROM systypes
WHERE name LIKE N'%datetime'
SET @sql=N'=@value'
END
ELSE IF @sql LIKE N'%int'
OR @sql LIKE N'%money'
OR @sql IN(N'real',N'float',N'decimal',N'numeric')
BEGIN
INSERT #t SELECT xtype FROM systypes
WHERE name LIKE N'%int'
OR name LIKE N'%money'
OR name IN(N'real',N'float',N'decimal')
SET @sql=N'=@value'
END
ELSE
SET @sql=N'=@value'
END
--保存结果的临时表
CREATE TABLE #(TableName sysname,FieldName sysname,Type sysname,SQL nvarchar(4000))DECLARE tb CURSOR LOCAL
FOR
SELECT N'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
WHEN t.name IN (N'decimal',N'numeric')
THEN N'('+CAST(c.prec as varchar)+N','+CAST(c.scale as varchar)+N')'
WHEN t.name=N'float'
OR t.name like N'%char'
OR t.name like N'%binary'
THEN N'('+CAST(c.prec as varchar)+N')'
ELSE N'' END,N'''')
+N',@sql)'
FROM sysobjects o,syscolumns c,systypes t,#t tt
WHERE o.id=c.id
AND c.xusertype=t.xusertype
AND t.xtype=tt.xtype
AND OBJECTPROPERTY(o.id,N'IsUserTable')=1OPEN tb
FETCH tb INTO @sql,@sql1
WHILE @@FETCH_STATUS=0
BEGIN
SET @sql1=N'IF EXISTS('+@sql+N') '+@sql1
EXEC sp_executesql @sql1,N'@value sql_variant,@sql nvarchar(4000)',@value,@sql
FETCH tb INTO @sql,@sql1
END
CLOSE tb
DEALLOCATE tb
SELECT * FROM #exec sp_ValueSearch '要搜索的值',1 --1或不输入(即默认值1)精确匹配
exec sp_ValueSearch '要搜索的值',0 --不等于1,模糊匹配Create PROC xb_GetTableNameAndColNameForValue
@value varchar(200)
AS
--求test库中包含值为@value的表和列名--存储表名和列名
IF object_id('tabss') IS NOT NULL
exec('drop table tabss')
CREATE TABLE Tabss(id int identity(1,1),tabname varchar(100),colName varchar(100))--查询某表某列是否包含某个值
IF object_id('ysgs') IS NOT NULL
exec('drop proc ysgs')
exec('create PROC ysgs(@tab varchar(100),@col varchar(100))
AS
exec(''select 1 from ''+@tab+'' where ''+@col+'' like ''''%'+@value+'%'''''')')--将结果存入tabss表中
EXEC master.dbo.xp_execresultset 'SELECT ''exec ysgs ''''''+object_name(id)+'''''',''''''+name+'''''';if @@rowcount>0 insert tabss (colname,tabname)values(''''''+name+'''''',''''''+object_name(id)+'''''')'' FROM syscolumns s WHERE xtype in(SELECT xtype FROM systypes s2 WHERE name in(''char'',''varchar'',''nchar'',''nvarchar''))
AND id in(SELECT id FROM sysobjects s2 WHERE xtype=''u'')',N'test'
GO
/*调用
exec xb_GetTableNameAndColNameForValue 'aa_1'
SELECT * FROM tabss
*/
Create PROC getFieldAll(@t VARCHAR(100),@v VARCHAR(20), @f VARCHAR(1000) OUT )
AS
BEGIN
DECLARE @name VARCHAR(40)
DECLARE @S NVARCHAR(1000),@C INT
SET @f='(2006)德旌法协执字第325-1号'
EXEC('declare cur cursor for select name from syscolumns where id=object_id('''+@t+''') and xtype in(SELECT xtype FROM systypes s2 WHERE name in(''char'',''varchar'',''nchar'',''nvarchar''))')
OPEN cur
FETCH NEXT FROM cur INTO @name
WHILE @@FETCH_STATUS=0
BEGIN
SET @S='select @s=count(1) from '+@t+' where ['+@name +'] like ''%'+@v+'%'''
EXEC sp_executesql @S,N'@s int out',@C OUT
IF @C>0
SET @f=@f+@name+','
FETCH NEXT FROM cur INTO @name
END
CLOSE cur
DEALLOCATE cur
RETURN
END go
EXEC sp_msforeachtable
@command1 = N'declare @l varchar(1000); exec getFieldAll ''?'',''aa_1'',@l out;if @l<>'''' select ''?'' 表名,@l 列名
'
create procedure getdata
(@BillNumberId varchar(10))
begin
declare @billnumberid
set @billnumberid='1'
declare @sql nvarchar(max)
select @sql=isnull(@sql+' union all ','')+'select * from '+name+' where BillNumberId='''+@BillNumberId+'''' from sys.objects where type='U'
exec(@sql)
end
go
create procedure getdata
(@BillNumberId varchar(10))
begin
declare @sql nvarchar(max)
select @sql=isnull(@sql+' union all ','')+'select * from '+name+' where BillNumberId='''+@BillNumberId+'''' from sys.objects where type='U'
exec(@sql)
end
go
资源不足,部分结果已被除去。Create PROC xb_GetTableNameAndColNameFoValue
@value varchar(200)
AS
--求test库中包含值为@value的表和列名--存储表名和列名
IF object_id('tabss') IS NOT NULL
exec('drop table tabss')
CREATE TABLE Tabss(id int identity(1,1),tabname varchar(100),colName varchar(100))--查询某表某列是否包含某个值
IF object_id('ysgs') IS NOT NULL
exec('drop proc ysgs')
exec('create PROC ysgs(@tab varchar(100),@col varchar(100))
AS
exec(''select 1 from ''+@tab+'' where ''+@col+'' like ''''%'+@value+'%'''''')')--将结果存入tabss表中
EXEC master.dbo.xp_execresultset 'SELECT ''exec ysgs ''''''+object_name(id)+'''''',''''''+name+'''''';if @@rowcount>0 insert tabss (colname,tabname)values(''''''+name+'''''',''''''+object_name(id)+'''''')'' FROM syscolumns s WHERE xtype in(SELECT xtype FROM systypes s2 WHERE name in(''char'',''varchar'',''nchar'',''nvarchar''))
AND id in(SELECT id FROM sysobjects s2 WHERE xtype=''u'')',N'200811'
GOexec xb_GetTableNameAndColNameFoValue '2011-04-01-PF-0130'
SELECT * FROM tabss
@value sql_variant, --要搜索的数据
@precision bit=1 --1=仅根据sql_variant中的数据类型查找对应类型的数据列.<>1,查询兼容的所有列,字符数据使用like匹配
AS
SET NOCOUNT ON
IF @value IS NULL RETURN--数据类型处理
SELECT xtype INTO #t FROM systypes
WHERE name=SQL_VARIANT_PROPERTY(@value,N'BaseType')--扩展数据类型及查询处理语句
DECLARE @sql nvarchar(4000),@sql1 nvarchar(4000)
IF @precision=1
SET @sql=CASE SQL_VARIANT_PROPERTY(@value,N'BaseType')
WHEN N'text' THEN N' LIKE N''%''+CAST(@value as varchar(8000))+''%'''
WHEN N'ntext' THEN N' LIKE ''%''+CAST(@value as nvarchar(4000))+''%'''
ELSE N'=@value' END
ELSE
BEGIN
SET @sql=CAST(SQL_VARIANT_PROPERTY(@value,N'BaseType') as sysname)
IF @sql LIKE N'%char' or @sql LIKE N'%text'
BEGIN
INSERT #t SELECT xtype FROM systypes
WHERE name LIKE N'%char' or name LIKE N'%text'
SELECT @sql=N' LIKE N''%''+CAST(@value as '
+CASE
WHEN LEFT(@sql,1)=N'n' THEN ' nvarchar(4000)'
ELSE 'varchar(8000)' END
+N')+N''%'''
END
ELSE IF @sql LIKE N'%datetime'
BEGIN
INSERT #t SELECT xtype FROM systypes
WHERE name LIKE N'%datetime'
SET @sql=N'=@value'
END
ELSE IF @sql LIKE N'%int'
OR @sql LIKE N'%money'
OR @sql IN(N'real',N'float',N'decimal',N'numeric')
BEGIN
INSERT #t SELECT xtype FROM systypes
WHERE name LIKE N'%int'
OR name LIKE N'%money'
OR name IN(N'real',N'float',N'decimal')
SET @sql=N'=@value'
END
ELSE
SET @sql=N'=@value'
END
--保存结果的临时表
CREATE TABLE #(TableName sysname,FieldName sysname,Type sysname,SQL nvarchar(4000))DECLARE tb CURSOR LOCAL
FOR
SELECT N'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
WHEN t.name IN (N'decimal',N'numeric')
THEN N'('+CAST(c.prec as varchar)+N','+CAST(c.scale as varchar)+N')'
WHEN t.name=N'float'
OR t.name like N'%char'
OR t.name like N'%binary'
THEN N'('+CAST(c.prec as varchar)+N')'
ELSE N'' END,N'''')
+N',@sql)'
FROM sysobjects o,syscolumns c,systypes t,#t tt
WHERE o.id=c.id
AND c.xusertype=t.xusertype
AND t.xtype=tt.xtype
AND OBJECTPROPERTY(o.id,N'IsUserTable')=1OPEN tb
FETCH tb INTO @sql,@sql1
WHILE @@FETCH_STATUS=0
BEGIN
SET @sql1=N'IF EXISTS('+@sql+N') '+@sql1
EXEC sp_executesql @sql1,N'@value sql_variant,@sql nvarchar(4000)',@value,@sql
FETCH tb INTO @sql,@sql1
END
CLOSE tb
DEALLOCATE tb
SELECT * FROM #exec sp_ValueSearch '55987.5',1 --1或不输入(即默认值1)精确匹配
--exec sp_ValueSearch '要搜索的值',0 --不等于1,模糊匹配
在关键字 'begin' 附近有语法错误。
服务器: 消息 156,级别 15,状态 1,过程 getdata,行 5
在关键字 'set' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,过程 getdata,行 6
第 6 行: 'max' 附近有语法错误。
服务器: 消息 137,级别 15,状态 1,过程 getdata,行 7
必须声明变量 '@sql'。
服务器: 消息 137,级别 15,状态 1,过程 getdata,行 8
必须声明变量 '@sql'。create procedure getdata
(@totalmoney varchar(10))
begin
declare @totalmoney
set @totalmoney='127.5'
declare @sql nvarchar(max)
select @sql=isnull(@sql+' union all ','')+'select * from '+name+' where totalmoney='''+@totalmoney+'''' from sys.objects where type='U'
exec(@sql)end
go
set @string='277972' --精确查找要搜索数值 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 ('numeric') --数据类型为数值型
)
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+' ='+cast(@string as varchar(20))
exec sp_executesql @sql,N'@i int output',@i=@j output --输出满足条件表的记录数
if @j>0
exec('select distinct '+@colname+' from ' +@tbname +' where '+ @colname+' = '+@string )
fetch next from colroy into @colname --@tbname+'-'+
end
close colroy
deallocate colroyfetch next from tbroy into @tbname
end
close tbroy
deallocate tbroy