2013-04-19 3 views
1

Я запутался:Invoke-Sqlcmd иногда сообщает об ошибках TSQL, а иногда нет?

Следующий код выдает ошибку:

try { 
    invoke-sqlcmd -ServerInstance 'localhost' -Database 'tempdb' -Query 'CREATE TABLE foo (bar TINYINT IDENTITY(1,1) DEFAULT 1);;' -Verbose -ErrorLevel 0 -AbortOnError -ErrorAction Stop -OutputSqlErrors $true -ErrorVariable $err -OutVariable $err -SeverityLevel 0; 
    "OK"; 
} 
catch { 
    "ERROR" 
    $_ 
} 

Результат:

ERROR Invoke-Sqlcmd : Defaults cannot be created on columns with an IDENTITY attribute. Table 'foo', column 'bar'.


Эта часть работает, по-видимому гладко:

try { 
    invoke-sqlcmd -ServerInstance 'localhost' -Database 'tempdb' -Query 'SELECT CAST(111111111111 AS TinyINT) AS Error' -Verbose -ErrorLevel 0 -AbortOnError -ErrorAction Stop -OutputSqlErrors $true -ErrorVariable $err -OutVariable $err -SeverityLevel 0; 
    "OK" 
} 
catch { 
    "ERROR" 
    $_ 
} 

Результат:

OK 

В обоих случаях улов-блок должен быть использован!

ответ

3

Это известная ошибка с invoke-sqlcmd. Я зарегистрировал его на Connect, элемент отмечен как фиксированный, но «фиксированный» в терминах подключения не обязательно означает, что исправление было выпущено или планируется для выпуска в текущей версии. Это просто означает, что оно было исправлено внутренне, и они когда-нибудь выпустят его.

По состоянию на 4/19/2013 исправление НЕ было выпущено.

+0

Спасибо, Чад! У вас есть обходной путь для этой проблемы? Как вы справляетесь с этим? – eghetto

+0

Мое обходное решение не использует invoke-sqlcmd или, по крайней мере, использовать его только тогда, когда мне не нужна обработка ошибок. Я либо использую свою собственную замену, либо sqlcmd.exe. Несколько подробнее здесь http://sev17.com/2012/11/12/sqlcmd-is-dead-long-live-sqlcmd/ –

+0

Эта проблема исправлена ​​в SQL 2014 CTP2. вы можете загрузить SQL 2014 CTP2 с http://www.microsoft.com/en-us/sqlserver/sql-server-2014.aspx – eghetto

-2

Я подозреваю, что это имеет какое-то отношение к конфигурации соединения, инициированного Invoke-SqlCmd; в частности, если ANSI_WARNINGS, установленное на OFF в SQL Server, позволяет оценить ваш TSQL-блок как NULL.

SET ANSI_WARNINGS OFF 
SELECT CAST(111111111111 AS TinyINT) AS Error 

Возвращает NULL.

+0

Спасибо Эфран, но я не думаю, что это имеет место здесь: _SET ANSI_WARNINGS ON; SELECT CAST (111111111111 AS TinyINT) AS Ошибка_ тоже не помогает. – eghetto