繁体   English   中英

SQL Server xml和nvarchar列

[英]SQL Server xml and nvarchar columns

我想通过下面的查询来实现这一点,我已经将表名分配给@table_names变量,现在想检查数据库中是否存在这些表。 如果他们没有,我想打印他们的名字并报错。

但是我认为IF OBJECT_ID(@TABLE_NAMES, 'U') IS NULL失败了,并且print命令列出了所有表名,而不管它们是否存在。

DECLARE @TABLE_NAMES nvarchar(MAX) =
(
        select distinct B.POP_TABLE_name + ' '
        from GEOLEVELS a
        left outer join GEOG b
        on a.GEOGid=b.GEOGid
        where   b.POP_TABLE_name is not null and 
                (a.x_COLUMN is not null and a.y_COLUMN is not null) OR
                a.z_column is not null 
                FOR XML PATH('') 

)
IF  OBJECT_ID(@TABLE_NAMES, 'U') IS NULL
PRINT 'Table not found : ' +  @TABLE_NAMES
RAISERROR('TABLE NOT FOUND %S',16,1,@TABLE_NAMES)

您的代码正在创建一个本地变量@TABLE_NAMES,然后检查具有该名称的USER_TABLE(即“ U”)。

由于您永远不会创建名称为@TABLE_NAMES的用户表,因此您的OBJECT_ID(@TABLE_NAMES,'U')将始终为NULL。

我认为您想要的是这样的:

DECLARE @TABLE_NAMES (ID INT IDENTITY(1,1), Name VARCHAR(255))
INSERT INTO @TABLE_NAMES (Name)
select distinct B.POP_TABLE_name
from GEOLEVELS a
left outer join GEOG b
on a.GEOGid=b.GEOGid
where   b.POP_TABLE_name is not null and 
        (a.x_COLUMN is not null and a.y_COLUMN is not null) OR
        a.z_column is not null 


DECLARE @Counter INT = (SELECT COUNT(*) FROM @TABLE_NAMES)
DECLARE @CurrentName VARCHAR(255)
DECLARE @TablesNotFound TABLE (TableName VARCHAR(255))
WHILE @Counter > 0
    BEGIN
        SET @CurrentName = (SELECT Name FROM @TABLE_NAMES WHERE ID = @Counter)
        IF OBJECT_ID(@CurrentName) IS NULL
            BEGIN
                PRINT 'Table not found: ' + @CurrentName
                INSERT INTO @TablesNotFound (TableName)
                VALUES (@CurrentName)
                SET @Counter = @Counter - 1
            END
        ELSE 
            BEGIN
                SET @Counter = @Counter - 1
            END
    END

IF (SELECT COUNT(*) FROM @TablesNotFound) > 0
    BEGIN
        DECLARE @ErrorTables VARCHAR(MAX) = (SELECT STUFF((SELECT ',' + TableName FROM @TablesNotFound ORDER BY TableName FOR XML PATH ('')), 1, 1, ''))
        RAISERROR(@ErrorTables,16,1)
    END

这会将与您的条件匹配的所有表名放入一个表变量中。 然后,它将遍历表(使用ID列和计数器),将不存在的表放入错误表中,然后将结果填充到一个文本变量中,并使用RAISERROR将其推出...这还将完成每个失败表的打印。 您遇到的问题是所有表名都被混在一起(尽管之间用空格隔开),并且“ SQL”将其视为一个字符串。 没有什么可以告诉它如何区分字符串中的表名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM