Ошибка SQL при изменении дизайна таблицы из sql management studio - PullRequest
0 голосов
/ 07 января 2011

У меня довольно большая таблица (более 20 столбцов) на SQL Server 2008. Я использую Microsoft SQL Server Management Studio, чтобы открыть представление дизайна таблиц и добавить столбец. После добавления столбца я перемещаю его вверх в сортировке столбцов.

На рисунке ниже показан столбец, который я добавил, и куда я пытаюсь переместить его, просто перетащив его на несколько мест вверх.

Column circeled is being added and moved up

После того, как я это сделал, я получаю исключение, когда пытаюсь открыть сайт. Все отлично работает, когда я добавляю столбец, не перемещая его вверх в сортировке столбцов.

Может кто-нибудь помочь мне разобраться с этой проблемой. Это ошибка на сервере MSSQL, в студии управления или что-то не так?

Исключение

Operand type clash: bit is incompatible with uniqueidentifier

Трассировка стека:

[SqlException (0x80131904): Operand type clash: bit is incompatible with uniqueidentifier]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +404
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +412
   System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1363
   System.Data.SqlClient.SqlDataReader.HasMoreRows() +301
   System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout) +422
   NHibernate.Driver.NHybridDataReader.Read() +28
   NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) +1383
   NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) +114
   NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) +195

[ADOException: could not execute query
[ SELECT * from SomeFunction(@p0,@p1) ]
  Name:Id - Value:3429fb7e-dba3-4c74-b41b-6f2e0bbb33f8  Name:Moment - Value:7-1-2011 12:16:45
[SQL: SELECT * from SomeFunction(@p0,@p1)]]
   NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) +637
   NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) +23
   NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery, QueryParameters queryParameters, IList results) +438
   NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification spec, QueryParameters queryParameters, IList results) +373
   NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification spec, QueryParameters queryParameters) +340
   NHibernate.Impl.SqlQueryImpl.List() +258
   CMS.ResourceAccess.DataAccessLogic.Repositories.NodeRepository.GetAncestors(Guid nodeId) in C:\Projects\Website\DataAccessLogic\Repositories\Repository.cs:228
   CMS.Business.Components.Services.NodeService.GetAncestors(Guid nodeId) in C:\Projects\Website\DataAccessLogic\Repositories\Service.cs:921
   CMS.Business.Components.Services.NodeService.GetSiteByNodeId(Guid nodeId) in C:\Projects\Website\DataAccessLogic\Repositories\Service.cs:1280
   Plugin.Wysiwyg.Business.Components.Services.WysiwygSearchService.RebuildIndex() +1232
   CMS.Business.Components.Services.SearchService.RebuildIndexForSites(IEnumerable 1 sites, ConfigurationManager configurationManager) in C:\Projects\Website\Services\Service.cs:303
   CMS.Business.Components.Services.SearchService.RebuildIndex() in C:\Projects\Website\DataAccessLogic\Repositories\Service.cs:252
   CMS.Backend.MvcApplication.Application_Start() in C:\Projects\Website\Global.asax.cs:49

[HttpException (0x80004005): could not execute query
[ SELECT * from SomeFunction(@p0,@p1) ]
  Name:Id - Value:3429fb7e-dba3-4c74-b41b-6f2e0bbb33f8  Name:Moment - Value:7-1-2011 12:16:45
[SQL: SELECT * from SomeFunction(@p0,@p1)]]
   System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +3988565
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +191
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +325
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +407
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +375

[HttpException (0x80004005): could not execute query
[ SELECT * from SomeFunction(@p0,@p1) ]
  Name:Id - Value:3429fb7e-dba3-4c74-b41b-6f2e0bbb33f8  Name:Moment - Value:7-1-2011 12:16:45
[SQL: SELECT * from SomeFunction(@p0,@p1)]]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11529072
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +141
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +4784373

EDIT: Я использую NHibernate как ORM

Ответы [ 3 ]

5 голосов
/ 07 января 2011

По моим расчетам, где-то в вашем коде SQL скрывается SELECT * (возможно, в функции или в представлении, на которое он опирается). Это только одна из многих причин, почему SELECT * опасен. Вот пример чего-то подобного, чтобы продемонстрировать один из таких режимов отказа:

create table dbo.T (
    ID int not null,
    FilterID uniqueidentifier not null,
    Val1 varchar(10) not null
)
go
insert into dbo.T (ID,FilterID,Val1)
select 1,'00000000-0000-0000-0000-000000000000','abc'
go
create view dbo.V
as
    select * from dbo.T
go
create function dbo.F ()
returns table
as
    return (select ID,Val1 from dbo.V where FilterID='00000000-0000-0000-0000-000000000000')
go
select * from dbo.F()
go

Вышеуказанное возвращает одну строку результатов, как и ожидалось. Теперь мы выполняем изменения так же, как SSMS, за кулисами:

create table dbo.Temp_T (
    ID int not null,
    Flag bit null,
    FilterID uniqueidentifier not null,
    Val1 varchar(10) not null
)
go
insert into dbo.Temp_T (ID,FilterID,Val1)
select ID,FilterID,Val1 from dbo.T
go
drop table dbo.T
go
sp_rename 'dbo.Temp_T','T'
go

И теперь мы снова запрашиваем нашу F-функцию:

select * from dbo.F()

И мы получаем:

Ошибка преобразования при преобразовании значения varchar '00000000-0000-0000-0000-000000000000' в бит типа данных.


На самом деле, если я изменю функцию F на:

create function dbo.F ()
returns table
as
    return (select ID,Val1 from dbo.V where FilterID=CONVERT(uniqueidentifier,'00000000-0000-0000-0000-000000000000'))
go

Я могу получить:

Столкновение с типом операнда: уникальный идентификатор несовместим с битом

2 голосов
/ 07 января 2011

Как вы получаете доступ к своей таблице из кода?Ошибка будет означать, что где-то в вашем коде вы обращаетесь к таблице, и ваш код зависит от последовательности столбцов.

Поскольку вы переместили свой столбец в другое место, теперь ваш код неожиданно пытается получить доступ к столбцунет.17 (или что-то в этом роде) и предполагает, что это столбец uniqueidentifier - но это уже не так, поскольку вы реорганизовали порядок столбцов в своей таблице ...

1 голос
/ 07 января 2011

Просто перекомпилируйте все представления, хранимые процедуры, UDF и TVF, которые ссылаются на эту таблицу.

SQL Server внутренне преобразует имена столбцов в числа.Когда вы перемещаете столбцы, это вызывает непредвиденные условия при запуске планов кэшированных запросов.

Я полагаю, что вы можете просто перезапустить SQL Server, чтобы он сбрасывал все планы.Впрочем, я этого не пробовал.

...