从sql management studio修改表设计时出现SQL错误

Rob*_*Rob 0 sql sql-server ssms sql-server-2008

我在SQL Server 2008上有一个相当大的表(20多列).我正在使用Microsofts SQL Server Management Studio打开表设计视图并添加一列.添加列后,我将其在列排序中向上移动.

下面的图像显示了我添加的列以及我试图将其移动到的位置,只需将其拖动几个位置即可.

卷绕的列正在添加并向上移动

在我完成这项工作之后,当我试图打开网站时,我会遇到异常.当我添加列而不在列排序中移动它时,一切正常.

有人可以帮我解决这个问题.这是MSSQL服务器,管理工作室中的错误还是其他出错的地方?

例外

Operand type clash: bit is incompatible with uniqueidentifier
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

[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
Run Code Online (Sandbox Code Playgroud)

编辑:我使用NHibernate作为ORM

Dam*_*ver 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
Run Code Online (Sandbox Code Playgroud)

以上返回单个结果行,如预期的那样.现在我们以与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
Run Code Online (Sandbox Code Playgroud)

现在我们再次查询我们的F函数:

select * from dbo.F()
Run Code Online (Sandbox Code Playgroud)

我们得到:

将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
Run Code Online (Sandbox Code Playgroud)

我可以得到:

操作数类型冲突:uniqueidentifier与bit不兼容

  • @Rob - 很乐意提供帮助.如果您希望将来更容易检测到这种情况,请考虑在视图和函数上启用SCHEMABINDING.然后,在尝试修改它们所依赖的表时,您会收到错误消息,但错误消息会准确地告诉您哪些视图/函数将受到更改的影响. (3认同)