2011-01-07 54 views
0

我在SQL服務器2008上有一個相當大的表(20 +列)。我使用Microsofts SQL Server Management Studio打開表設計視圖並添加柱。添加列後,我將它在列排序中向上移動。從SQL管理工作室修改表設計時出現SQL錯誤

下面的圖片顯示了我添加的列,以及我試圖通過將它拖到幾個地方來移動它的位置。

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 

編輯: 我使用NHibernate作爲ORM

+2

如果您只是在現有表格的末尾添加新列,它將爲您節省大量時間和精力。爲了SSMS重新排列上面的列,它必須將整個表複製到單獨的臨時表中,拆除引用當前表的所有約束,刪除當前表,重命名臨時表並重建所有約束。而在最後添加一個新的可空列可以像元數據更改一樣簡單。 – 2011-01-07 13:33:36

+0

@Damien我同意。我唯一不在乎的是一個空的或幾乎空的/原型的數據庫。 – IamIC 2011-01-07 14:55:23

+0

hmz,也許這確實是一件好事。猜猜我現在可以通過刪除列解決它,重新創建它在底部,只是不關心排序.. – Rob 2011-01-07 15:01:48

回答

5

有一個SELECT *潛伏在您的SQL代碼的某處(可能位於功能,或它依賴的視圖),我的清算。這只是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 

現在,我們再次查詢我們的殲功能:

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

你是如何從代碼中訪問你的餐桌?該錯誤會指示代碼中的某處訪問該表,並且代碼取決於列的順序。

由於您已將列移動到另一個地方,現在突然您的代碼嘗試訪問列號。 17(或其他),並假設這是一個uniqueidentifier列 - 但不再是這種情況,因爲您重新組織了您的表的列順序....

+0

我正在一個asp.net/C#應用程序,我使用NHibernate作爲ORM來映射從我的應用程序到數據庫的實體。但我很確定問題是由數據庫級別或管理工作室造成的。因爲當我不移動列時,一切正常。但是這不是我想要的,因爲它是一個相當大的表格,我還希望在數據庫級別保持可讀性和可維護性 – Rob 2011-01-07 12:16:46

1

只需重新編譯所有視圖,存儲程序,UDF和TVF引用此表。

SQL Server在內部將列名轉換爲數字。當您移動列時,這會在運行緩存查詢計劃時導致意外情況。

我相信你也可以重新啓動SQL Server來使其刷新所有計劃。雖然我沒有嘗試過。

相關問題