小编Lou*_*ers的帖子

在 INSERT 语句的 OUTPUT INTO 子句中使用源列 (SQL Server)

我正在编写批处理插入语句,并希望使用临时表来跟踪插入的 ID,而不是自己循环遍历项目并为每个插入的行调用 SCOPE_IDENTITY()。

需要插入的数据具有(临时)ID 将其链接到也应该插入到另一个表中的其他数据,因此我需要实际 Id 和临时 Id 的交叉引用。

这是我到目前为止所拥有的一个例子:

-- The existing table 
DECLARE @MyTable TABLE (ID INT IDENTITY(1,1), [Name] NVARCHAR(MAX));

-- My data I want to insert
DECLARE @MyInsertData TABLE (ID INT, [Name] NVARCHAR(MAX));
INSERT INTO @MyInsertData ( ID,Name)
VALUES ( -1 , 'bla'),(-2,'test'),(-3,'last');

DECLARE @MyCrossRef TABLE ([NewId] INT, OldId INT);

INSERT INTO @MyTable ( [Name] )
   OUTPUT Inserted.ID, INS.ID INTO @MyCrossRef
   SELECT [NAME] FROM @MyInsertData INS

-- Check the result
SELECT * FROM @MyCrossRef
Run Code Online (Sandbox Code Playgroud)

问题是我无法让 OUTPUT INTO …

insert output-clause

24
推荐指数
2
解决办法
2万
查看次数

为什么在使用 WHERE claue 调用视图中的 ORDER BY 子句时会被忽略?

我有一个连接多个表的视图,只是为了简化一个经常调用的查询。此视图在计算字段上有一个 ORDER BY 子句(顺序永远不会不同)。(在 SQL Server Express 2008 R2 上)。

基本思路是这样的(简化):

SELECT [EventType].Name, 
    [EventType].TotalOccurrences, 
    [Session].ID, 
    [Session].TotalOccurrences, 
    [Session].TotalOccurrences / [EventType].TotalOccurrences AS saturation
FROM [EventType]
    INNER JOIN [Session] ON [EventType].ID = [Session].Event
ORDER BY saturation
Run Code Online (Sandbox Code Playgroud)

但是,如果没有 where 子句,则永远不会调用此视图(在我的情况下,它几乎会返回整个数据库)。它将永远与WHERE [EventType].ID = x. 但是,一旦我添加了 where 子句,就会忽略 ORDER BY 子句!如果没有 where 子句,它会按预期工作。

实际上是一个不同的问题,但我在处理的时候把它扔在这里,有没有更好的方法来检索这些信息?的[EventType].Name[EventType].TotalOccurrences将是所有返回的行,这是网络带宽小腰相同。这不是问题,但我想知道是否有任何方法可以解决这个问题,而没有多次往返数据库的延迟开销?

[编辑] 上面的示例过于简化,计算字段有其他因素,因此它会返回与ORDER BY [Session].TotalOccurrences本示例中的简单顺序不同的顺序,但原理应该很清楚。

[Edit2] 从答案我得出的结论是,图形设计器比底层数据库具有更多的功能:

SSMS 中的 Bugus 功能

sql-server order-by sql-server-2008-r2 view

4
推荐指数
1
解决办法
1万
查看次数

使用 varbinary(max) 条件选择(在 where 子句中)

基础信息

  • 数据库:SQL Server Express 2008 R2
  • 客户:SQL Server Management Studio

背景(不感兴趣可跳过):

我正在维护的一个项目使用 ORM,它显然将我的枚举值(从 Byte 继承)存储到存储在 varbinary(max) 字段中的二进制序列化 .Net 对象中。我只是在出现新的要求要求我的代码在中等信任度下运行后才发现这种情况发生。由于 .Net 二进制格式化程序需要完全信任才能被调用,因此它开始在枚举上崩溃。

为了清理混乱,我需要创建迁移脚本,将这些 (varbinary(max)) 值转换回整数值。只有少数不同的值,所以这应该不是一个大问题(我认为)。

问题

选择时,我能够获得 blob 的字符串表示:

SELECT BinValue FROM MyTable where Type = 'Object';
Run Code Online (Sandbox Code Playgroud)

它返回一个字符串“0x...(一个十六进制值的数组)”。

但是当我尝试使用复制和粘贴在列上进行选择时,确保我有确切的二进制等效项:

SELECT ItemId FROM MyTable WHERE Value=convert(varbinary(max), '0x...')
Run Code Online (Sandbox Code Playgroud)

它不返回任何记录。

那么是否可以使用客户端(例如 Management Studio)来解决这个问题?

如果是这样,正确的语法是什么?

sql-server-2008-r2 blob array

3
推荐指数
1
解决办法
9004
查看次数

规范化共享实体并应用约束

我正在寻找关于在不同实体之间共享的实体的特定“最佳实践”或“模式”,这些实体与众多实体中的一个有关系。

例如,可能有通用实体“地址”,它可用于存储客户、供应商、员工等的公共地址字段......

经验丰富的 DBA 会采取这种方式,还是宁愿将字段添加到相应的实体中?我也在考虑可维护性,可能(将来)会因实体而异的约束,诸如此类。

我很想得到有关该主题的任何权威或既定作品的参考。

normalization database-design design-pattern subtypes

2
推荐指数
1
解决办法
1060
查看次数