日期:2014-05-18  浏览次数:20548 次

function 表名作为变量
要求:表名@tt   varchar(100),字段名@ff   varchar(100),字段值@vv   varchar(100)
返回,是否有这个值,是返回1,不是返回0
怎么写这样的function   ?



------解决方案--------------------
declare @sql nvarchar(4000), @tt varchar(100), @off varchar(100), @vv varchar(100), @exists bit
select @tt = 'sysobjects ', @off = 'name ', @vv = 'syscolumns '
set @sql = N 'if exists (select 1 from ' + @tt + ' where ' + @off + ' = @vv) set @exists = 1 '
exec sp_executesql @sql, N '@vv varchar(100), @exists bit output ', @vv, @exists output
set @exists=isnull(@exists, 0)
select @exists
/*
if @exists = 1 --存在
else --不存在
*/

------解决方案--------------------
我是以pubs 中jobs 表测试过的

楼主加上(),就正确了
------解决方案--------------------
--必须表名、字段名、对应的值都存在时,返回1,否则返回0.

--在动态SQL中再用动态SQL就可以了,如:


declare
@num int,
@sql nvarchar(4000),
@表名 nvarchar(100),
@字段名 nvarchar(100),
@值 nvarchar(100)

set @表名 = '部门 '
set @字段名= '部门编码2 '
set @值= '1 '

set @sql= '
if exists (select * from information_schema.columns where table_name= ' ' ' + @表名 + ' ' ' and column_name= ' ' ' + @字段名 + ' ' ')
begin
declare @s nvarchar(1000),@n int
set @s = ' 'select @b=count(*) from ' + @表名 + ' where ' + @字段名 + ' = ' ' ' ' ' + @值 + ' ' ' ' ' ' '
exec sp_executesql @s,N ' '@b int output ' ',@n output
if @n> 0 set @a=1 else set @a=0
end
else
begin
set @a=0
end '
print @sql
exec sp_executesql @sql,N '@a int output ',@num output

if @num> 0
select '存在 '
else
select '不存在 '


--select * from information_schema.columns

------解决方案--------------------
create proc test
@tt varchar(100),
@ff varchar(100),
@vv varchar(100)
as
exec( 'select 1 from '+@tt+ ' where '+@ff+ '= ' ' '+@vv+ ' ' ' ')
if @@rowcount> 0
return 1
else
return 0

go
--调用
declare @a int
exec @a=test '表名 ', '字段名 ', '值 '
select @a
--有错?
------解决方案--------------------
方法1:
if object_id( 'spTest ') is not null
drop proc spTest
GO
create proc spTest @tt varchar(100),@ff varchar(100),@vv varchar(100)
as
declare @sql nvarchar(2000),@count int
set @count = 0
set @sql =
N 'set @count = case when exists(select 1 from ' + @tt + N ' where ' + @ff + N '= ' ' ' + @vv + N ' ' ') then 1 else 0 end '
EXEC sp_executesql @sql,N '@count int OUPPUT ',@count output
RETURN @count
GO

----调用存储过程,获得存储过程返回值
declare @count int
EXEC @count = spTest '表名称 ', '列名称 ', '列值 '
select @count

方法2:
可以为存储过程多加一个返回型(OUTPUT)参数,执行存储过程后判断该返回型参数的值:
if object_id( 'spTest ') is not null
drop proc spTest
GO
create proc spTest @tt varchar(100),@ff varchar(100),@vv varchar(100),@count int OUTPUT