SQLAlchemy 仅在行中有回车符时返回列表行 (SQL Server)

SQLAlchemy Only Returns List Line if there are Carriage Returns in the Row (SQL Server)

提问人:javery 提问时间:9/27/2023 最后编辑:javery 更新时间:9/27/2023 访问量:42

问:

我有一个SQL查询,它生成DDL以基于现有架构创建表。我正在运行它以将架构复制到另一个数据库以进行备份。我无权在SQL Server中以正常方式执行此操作,因此我正在使用其他方式。

下面是我的查询应返回的 DDL 文本(我已验证查询是否在 SSMS 中返回);它只有一行(和列),标题名称为“DDL”:

SET NOCOUNT OFF;
IF OBJECT_ID('[<schema_name>].[<table_name>]','SN') IS NOT NULL DROP SYNONYM [<schema_name>].[<table_name>];
IF OBJECT_ID('[<schema_name>].[<table_name>]','U') IS NOT NULL DROP TABLE [<schema_name>].[<table_name>];
RAISERROR('CREATE TABLE %s',10,1, '[<schema_name>].[<table_name>]') WITH NOWAIT;

CREATE TABLE [<schema_name>].[<table_name>] (
 ... column definitions ...
)  
RAISERROR('CREATING INDEXES OF  %s',10,1, '[<schema_name>].[<table_name>]') WITH NOWAIT; 

但是,sqlachemy 只返回最后一行:

RAISERROR('CREATING INDEXES OF  %s',10,1, '[<schema_name>].[<table_name>]') WITH NOWAIT; 

下面是围绕其拉取位置的 python 代码:

def get_create_ddls(table_name_list: list, conn) -> list:
    fd = open('CreateCreateDDL.sql', 'r')
    original_query = fd.read()
    fd.close()

    return_list = []
    for name in table_name_list:
        # prefixed the views as "V_"
        isView = name[:2] == "V_"

        if isView:
            tbl_insert_str = "('" + name[2:] + "')"
        else:
            tbl_insert_str = "('" + name + "')"

        query = original_query.replace("<INSERT_TABLE_NAME_HERE>", tbl_insert_str, 1)

        result = conn.execute(sqlalchemy.text(query))

        # TODO: Only reading last line of the row
        value_str = ""
        for row in result:
            temp_value = row.DDL 
            value_str += temp_value

        print(value_str)

        if isView:
            # put the "V_" back into the CREATE statement
            view_name = name[2:(name.find("].[") + 3)] + "V_" + name[(name.find("].[") + 3):]
            value_str = value_str.replace(name[2:], view_name)

        return_list.append(value_str)

    return return_list

如何在不进入并从源查询中手动删除每个回车符的情况下解决此问题?他们有很多。

python-3.x sql-server sqlalchemy

评论

0赞 siggemannen 9/27/2023
您是否正在使用 some for xml 来生成查询?
0赞 javery 9/27/2023
我没有生成任何 XML,生成结果的查询中也没有任何 XML。生成这些语句的查询是对本文的改编。问题中的尖括号只是实际架构和表名称的占位符。
0赞 siggemannen 9/27/2023
只是想知道返回到 sqlalchemy 的列是否由于“for xml”处理不当而被截断。如果 sqlalchemy 会进入并拆分一些行并删除大量文本,这听起来很奇怪......所以这里可能正在发生一些更简单的事情。
0赞 javery 9/27/2023
如果我猜的话,我敢打赌默认的“行分隔符”字符是“\r”,这就是这里分隔行的原因,并且由于查询应该只返回 1 行,因此它一次只保留一行,这就是为什么我们只看到最后一行。我不知道有什么方法可以在不改变脚本的情况下解决行为问题。

答:

0赞 javery 9/27/2023 #1

我将把这个问题留出来,因为我认为一般答案会更合适(即返回带有回车符的文本单元格的查询的解决方案),但是在生成此 DDL 的脚本中,脚本定义了回车符,如下所示:

DECLARE @CR NVARCHAR(max) = NCHAR(13);

然后 用于 Carriage 返回脚本的其余部分。因此,解决方案只是使用不同的分隔符:@CR

DECLARE @CR NVARCHAR(max) = NCHAR(32); -- space

感谢 ildannydevart 生成上述 DDL 的脚本。