Использование Python для выполнения bcp для экспорта запроса с удаленного сервера на локальный диск - PullRequest
0 голосов
/ 28 января 2019

У меня есть следующая группа утверждений python.Я использую динамически построенные операторы SQL, используя Python.Полученный оператор SELECT затем используется как оператор queryout в BCP.

Моя проблема в том, что сам запрос слишком велик, и BCP не может его обработать.Я подтвердил, что BCP работает с использованием:

BCP "Select * from <<DATABASE.dbo.TABLE>>" queryout "D:\data\test.csv" -t^ -r '0x0A' 
    -U <<USER>> -P <<PASSWORD>> -S "LIVE" -c -C65001

Но если оператор select возвращает большой набор данных, оператор завершается ошибкой.Как я могу противостоять этому?Таблица большая (более 100 м записей), и все, что я хочу сделать, это использовать динамический SQL для ее экспорта с удаленного сервера в локальную таблицу.

Python Script:

def getRoster(self):
    self.conn = pyodbc.connect(self.ConnStr)
    sql = r'SELECT * FROM <<DB>>.dbo.TableConfiguration'
    self.roster = pd.read_sql(sql,self.conn)

def GenerateSQL(self, table):
    exportsql = 'select '

    columnsql = """select
                    'CASE WHEN ISNULL('+COLUMN_NAME+', '''') = '''' THEN '''' ELSE '+COLUMN_NAME+' END AS '+UPPER(COLUMN_NAME)
                    from <<DB>>.INFORMATION_SCHEMA.COLUMNS
                    where TABLE_NAME = '%s'
                    order by ORDINAL_POSITION""" % table.tablename
    self.conn = pyodbc.connect(self.ConnStr)
    cursor = self.conn.cursor()
    cursor.execute(columnsql)
    exportsql += ', '.join([field[0] for field in cursor])
    exportsql += ' from {}.dbo.{}'.format(table.dbname, table.tablename)
    exportsql += ' {}'.format(table.Clause)
    return (exportsql)

def ExportTables(self):
    now = datetime.now()
    self.getRoster()
    for row in self.roster.itertuples():
         SQL = self.GenerateSQL(row)
         self.filename = '{}_{}.csv'.format(row.tablename, now.strftime("%Y-%m-%d"))
         command = 'BCP \"{}\" queryout \"{}\" -t|| -U "<<USER>>" -P <<PASSWORD>> -S "LIVE" -T -r 0x0a -c -C65001'.format(SQL, os.path.join(self.path, self.filename))
         print (command)
         subprocess.run(command)

при тестировании bcp с SELECT 'test' все возвращается в порядке.но когда генерируется sql, sql работает в SMSS, но в bcp ошибка:

SQLState = 28000, NativeError = 18452
Error = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Login failed. The login is from an untrusted domain and cannot be used with Windows authentic
ation.

1 Ответ

0 голосов
/ 31 января 2019

Удалите параметр -T из командной строки BCP и используйте аутентификацию SQL Server.

Утилита bcp - T

Когда подключается утилита bcpдля SQL Server с доверенным соединением с помощью встроенной защиты используйте параметр -T (доверенное соединение) вместо комбинации имени пользователя и пароля.Когда утилита bcp подключается к базе данных SQL или хранилищу данных SQL, использование проверки подлинности Windows или Azure Active Directory не поддерживается.Используйте опции -U и -P.

...