如题!

解决方案 »

  1.   


    如何根据字段查询出拥有该字段的表名。在实际应用中碰到这种问题的情况很多。下面就介绍一下方法。
    还是以浪潮gs5为例。系统登陆的时候提示defposid字段无效。这种问题很普遍,也很简单,处理方式如下:
    方法一:打开sql server的事件查看器,新建跟踪。重新登陆gs5,报错以后看事件查看器在执行那个语句,这一步需要判断到底是哪个表,判断好以后就可以在企业管理器种增加该字段。
    方法二:使用语句直接查找。
    use 数据库名
    select * from  syscolumns 
    where name = 'defposid'
    在查询结果中我们查找id字段把值放到下边的where条件中
    select * from sysobjects
    where id=741577680
    查询结果中name字段就是我们要找的表名
    或者使用系统函数object_name().
    select object_name(741577680)
    然后在查询的表中添加相应的字段
     
      

  2.   


    CREATE PROC sp_ValueSearch
    @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,模糊匹配
      

  3.   

    回上楼
    消息 2714,级别 16,状态 3,过程 sp_ValueSearch,第 90 行
    数据库中已存在名为 'sp_ValueSearch' 的对象。
      

  4.   

    已经存在的话看看你的sp_ValueSearch 是干什么用的?如果功能一样直接使用即可,不一样的话的,就把我发出的存储过程改个名字。