【问题标题】:Need to dynamically check for columns in other databases需要动态检查其他数据库中的列
【发布时间】:2015-07-24 11:21:44
【问题描述】:

我的应用程序运行在多个数据库上,它需要能够从一个数据库中检查一个列是否存在于另一个数据库中。不幸的是,直到运行时我才知道第二个数据库的名称,所以它需要是动态的。此外,它必须在多个地方执行此操作,所以理想情况下我想将它变成一个函数,但这给我带来了问题,因为函数不会运行动态 SQL。

这是我写的(不工作的)函数.....

CREATE FUNCTION [dbo].[fn_checkcolexists] (
    @dbname VARCHAR(100)
    ,@tablename VARCHAR(100)
    ,@colname VARCHAR(100)
    )
RETURNS BIT
AS
BEGIN
    DECLARE @sqlstring NVARCHAR(2000)

    SET @sqlstring = 'select @retVal = 1 from ' + @dbname + '.sys.columns cols inner join yodata_dev_load.sys.tables tabs
on cols.object_ID=tabs.object_ID where cols.name=''' + @colname + ''' and tabs.name=''' + @tablename + ''''

    DECLARE @retVal INT

    EXEC sp_executesql @sqlstring
        ,N'@retVal int output'
        ,@retVal OUTPUT

    RETURN @retval
END

有没有人对我如何做到这一点提出任何建议?我找不到访问每个数据库的列信息的方法。这些信息是否存在于任何地方的系统数据库中?

或者,我可以为其他数据库创建某种同义词吗?

编辑:How to find column names for all tables in all databases in SQL Server 不是一个理想的解决方案,因为它还依赖于动态 SQL,所以我不能将其用作函数

【问题讨论】:

标签: sql sql-server


【解决方案1】:

使用存储过程并使用其中之一

其中一种方法是使用无证

EXEC sp_msforeachdb 'SELECT table_catalog FROM ?.INFORMATION_SCHEMA.COLUMNS
where table_name=''your_table'' and column_name=''your_column_name'''

或者模拟一下

declare @sql varchar(max), @table_name varchar(100)
select @sql='', @table_name='your_table'
select  @sql=@sql+ 'SELECT table_catalog 
FROM '+name+'.INFORMATION_SCHEMA.TABLES 
 where table_name='''+@table_name+'''  and 
 column_name=''your_column_name''' from sys.databases
exec(@sql)

【讨论】:

  • 这个解决方案似乎不太理想,因为它使用动态SQL,所以我无法将它包装在一个函数中。而且,它依次查询每个数据库,这似乎有点低效。我希望有一个类似于 sys.columns 的表,但它包含有关所有 db 的信息,但我想不存在这样的东西
【解决方案2】:

我想我已经找到了我想要的解决方案。我正在使用 COL_LENGTH,这似乎可以完成这项工作。您可以为 is 指定一个 dbname,甚至将其作为参数传递,如果该列不存在,则返回 null。

例如

声明@dbname varchar(200)='dbname'

选择 COL_LENGTH(@dbname + '.dbo.tablename','columnname')

如果返回 null,则该列不存在

非常感谢本帖的所有贡献者

【讨论】:

    【解决方案3】:

    希望这对你有用

    CREATE FUNCTION [dbo].[fn_checkcolexists]
    (
        @dbname VARCHAR(100)
        ,@tablename VARCHAR(100)
        ,@colname VARCHAR(100)
    )
    RETURNS INT
    AS
    BEGIN
        DECLARE @RECCOUNT INT = 0
        SELECT @RECCOUNT = COUNT(*) FROM   information_schema.columns WHERE  TABLE_CATALOG = @dbname AND COLUMN_NAME = @colname  AND TABLE_NAME = @tablename    
        RETURN @RECCOUNT  
    END
    GO
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多