需要动态检查其他数据库中的列

时间:2015-07-24 11:21:45

标签: sql sql-server

我的应用程序在几个数据库上运行,它需要能够从一个数据库进行检查,以查看另一个列中是否存在列。不幸的是,直到运行时我才知道第二个数据库的名称,所以它需要是动态的。此外,它必须在多个地方执行此操作,因此理想情况下我希望将其转换为函数,但这会给我带来问题,因为函数不会运行动态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,因此我无法将其用作函数

3 个答案:

答案 0 :(得分:0)

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

其中一种方法是使用未记录的

f(&n)

或模拟它

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

答案 1 :(得分:0)

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

例如

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

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

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

非常感谢这个主题的所有贡献者

答案 2 :(得分:0)

希望这适合你

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