Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否可以测试列是否存在,然后根据列是否存在选择操作?_Sql_Sql Server - Fatal编程技术网

Sql 是否可以测试列是否存在,然后根据列是否存在选择操作?

Sql 是否可以测试列是否存在,然后根据列是否存在选择操作?,sql,sql-server,Sql,Sql Server,我试图创建一个通用的查询,以便针对同一数据库的不同版本运行。在旧版本中,我试图处理的特定表中不存在某些列。这个想法是由一个不知道自己的版本的人来运行。因此,我试图进行查询检查,如果某个列存在,如果该列不存在,那么其他有问题的列也不会存在,然后根据哪些列存在和不存在运行同一脚本的两个变体中的一个 掩盖一些专有信息,这是问题所在: IF COL_LENGTH('dbo.users', '<column A>') IS NOT NULL -- Check for existence of

我试图创建一个通用的查询,以便针对同一数据库的不同版本运行。在旧版本中,我试图处理的特定表中不存在某些列。这个想法是由一个不知道自己的版本的人来运行。因此,我试图进行查询检查,如果某个列存在,如果该列不存在,那么其他有问题的列也不会存在,然后根据哪些列存在和不存在运行同一脚本的两个变体中的一个

掩盖一些专有信息,这是问题所在:

IF COL_LENGTH('dbo.users', '<column A>') IS NOT NULL -- Check for existence of <column A> column
                                                                   -- Some earlier versions do not have this column

                UPDATE Users
                SET Password = 'XXXX', <column A> = 0, <column B> = NULL
                WHERE Login = 'User' -- Reset password for later versions

            ELSE

                UPDATE Users
                SET Password = 'XXXX'
                WHERE Login = 'User' -- Reset password for earlier versions

            PRINT 'The Password for Login "User" has been reset to XXXX.'
        END
我发现的问题是,这个区域上面的整个脚本都出错了,什么也不做,因为旧版本数据库中不存在列A。如果该列不存在,它似乎不会忽略显示的第一个update语句

在较新版本的DB上进行测试是完全成功的,尽管该版本有A列


任何关于这方面的想法都将不胜感激。谢谢。

问题是脚本需要编译。您缺少编译中的列。我可以建议:

IF EXISTS (SELECT 1
           FROM INFORMATION_SCHEMA.COLUMNS c
           WHERE TABLE_SCHEMA = 'dbo' AND
                 TABLE_NAME = 'users' AND
                 COLUMN_NAME = '<column A>'
          ) -- Check for existence of <column A> column
BEGIN
-- Some earlier versions do not have this column
    EXEC('
UPDATE Users
    SET Password = ''XXXX'', <column A> = 0, <column B> = NULL
    WHERE Login = ''User''
'); -- Reset password for later versions
END;
ELSE
BEGIN
    UPDATE Users
        SET Password = 'XXXX'
        WHERE Login = 'User' -- Reset password for earlier versions

    PRINT 'The Password for Login "User" has been reset to XXXX.'
END;

两个版本都有密码,所以ELSE应该可以编译。

问题是脚本需要编译。您缺少编译中的列。我可以建议:

IF EXISTS (SELECT 1
           FROM INFORMATION_SCHEMA.COLUMNS c
           WHERE TABLE_SCHEMA = 'dbo' AND
                 TABLE_NAME = 'users' AND
                 COLUMN_NAME = '<column A>'
          ) -- Check for existence of <column A> column
BEGIN
-- Some earlier versions do not have this column
    EXEC('
UPDATE Users
    SET Password = ''XXXX'', <column A> = 0, <column B> = NULL
    WHERE Login = ''User''
'); -- Reset password for later versions
END;
ELSE
BEGIN
    UPDATE Users
        SET Password = 'XXXX'
        WHERE Login = 'User' -- Reset password for earlier versions

    PRINT 'The Password for Login "User" has been reset to XXXX.'
END;

这两个版本都有密码,所以其他版本应该可以编译。

如果你用你正在使用的RDBMS标记你的帖子,这会有所帮助。很抱歉,我不是一个真正的DBA,只是一个管理使用DB的特定程序的人。什么是RDBMS?您正在使用Oracle吗?MySQL?PostgreSQL?MySQL?Microsoft SQL Server?等相应地标记您的帖子将传达您可以使用的一些工具。mssqlmanagementstudio。我很抱歉。请将引用可能不存在的列的代码放在EXEC中,这样,只有当该分支被执行时,它才会被编译。如果您使用正在使用的RDBMS标记您的帖子,这将有所帮助。我很抱歉,因为我不是真正的DBA,只是管理使用DB的特定程序的人。什么是RDBMS?您正在使用Oracle吗?MySQL?PostgreSQL?MySQL?Microsoft SQL Server?等相应地标记您的帖子将传达您可以使用的一些工具。mssqlmanagementstudio。很抱歉,请将引用可能不存在的列的代码放在EXEC中,这样只有当该分支被执行时,它才会被编译谢谢你,Gordon。这工作做得很好非常感谢。谢谢你,戈登。这工作做得很好非常感谢。