标签: sql-server

执行从选择生成的动态 SQL

SQL 中的一个业务流程可以为每个操作生成一个变量1-N 次调用存储过程,其目的是插入与主流程相关的数据。

如何从选择执行多行生成的 sql 或者有没有办法从选择调用存储过程?


这一步之前的过程是涉及到业务逻辑和数据驱动的操作,对相关的FK连接表做了后续的插入。

在需要调用存储过程的那一点上,它已经准备好在表变量中处理数据。调用存储过程的步骤(过程中的逻辑)是一个涉及过程,在存储过程中是有意义的,并且不能复制到现有过程中。


由Select.

SELECT 'EXEC [sim].[ROI_Save] ' + CONVERT(varchar(6), VSL.PathId)           + ', '
                                + Convert(varchar(6), @ROIResultId)         + ', '
                                + CONVERT(varchar(6), RT.routeTypeResultId) + ', '
                                + CONVERT(varchar(6), RT.ROI_RouteTypeId)   + '; '
FROM  @routeResultIds RT
JOIN sim.ROI_Result_Vehicle VSL ON RT.ROI_Result_VehicleId = VSL.ROI_Result_VehicleId 
Run Code Online (Sandbox Code Playgroud)

结果

在此处输入图片说明

是否连接结果并调用Exec?

sql-server dynamic-sql t-sql sql-server-2012

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

用另一个表 B 的随机 ID 填充表 A

我有两个表,我想用随机值的表的 ID更新GebruikerID表中的列。TopicGebruiker

你还必须知道以下几点:

  • Topic.GebruikerID引用Gebruiker.ID.
  • 并非每个 ID 都在两个表中使用。
  • 必须生成的随机数存在于表Gebruiker(列ID)中,必须更新到表Topic(列GebruikerID)中。
  • 我在快速版中使用 SQL 服务器。

这里有一些图片。

  • 表之间的关系

  • Gebruiker-table的 ID

sql-server random

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

与 SELECT * 连接

我想将列与SELECT *. 例如:

SELECT * FROM Table1

Result:

Col1 Col2
---- ----
Joe  Smith
Run Code Online (Sandbox Code Playgroud)

我想做类似的事情 SELECT CONCAT(*) FROM Table1

我不能按名称提及列的原因是它们是由行中的 PIVOT 生成的,因此这些列可以有任意数量。

如果有人知道答案,或者知道如何将任意数量的行中的数据获取到单个单元格中,以逗号分隔,请告诉我。

sql-server pivot

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

字符串函数左1000,但只到最后一个句点或回车

我有文本块,长度在 500 到 2000 个字符之间。

我需要能够做的是从描述中最多提取 1000 个字符,但仅限于最后一个句号或回车符(Char(13)),这样文本就不会在句子中间被截断。如果同时有句号和 Char(13),我希望它在句号处关闭。

我正在粘贴一些随机生成的文本以尝试显示我的意思。

*打开包装友好欣喜若狂所以可能幽默。充足的结束可能会愚蠢地安静一组说她。我们不是前谷的保证。四需要现场咋说我们找哩。被命令他确信达斯伍德确实没收了。害羞庆祝她合理但遇到的情绪。建议其处理好婚前社交。图纸导致最大的添加主题努力同性恋记住。原则一但您遇到的帮助是不可能的。谁到达结束如何肥沃启用。哥哥她加了还见分毫自然的微笑条画。自己在出动兴趣昏迷不觉兴旺吧。她喧闹的用她不一样的友情表达。性生活迅速兴起。先生的事情做很多其他虚荣自己等待。总是教区品味,就像父亲先生用餐一样。

或者在主要地址中什么都不是。其使直人高度依赖。火腿窗十六问命问。是在唱喜欢必须显示。真男孩法县她无法她的妹妹。像六点一样让你离开。其中性是现在建立的休假法。在快速脸红的内置表中。功过就怕或热情落后。在任何这样的春天希望。忧郁的方式留言*

我希望能够将所有文本返回到“主要地址”。(990 个字符)。

sql-server sql-server-2012

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

INFORMATION_SCHEMA.VIEW_TABLE_USAGE 仅显示来自同一目录的表

我正在使用具有许多跨数据库视图的数据库。虽然 INFORMATION_SCHEMA.VIEWS 列出了所有这些视图,但 INFORMATION_SCHEMA.VIEW_TABLE_USAGE 和 INFORMATION_SCHEMA.VIEW_COLUMN_USAGE 没有。

所有有问题的视图都采用以下格式:

CREATE VIEW [dbo].[Invoice]
AS SELECT * FROM [otherdb].[dbo].[Invoice]
Run Code Online (Sandbox Code Playgroud)

以下查询返回 0 行:

SELECT
    VIEW_CATALOG
    ,VIEW_SCHEMA
    ,VIEW_NAME
FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE TABLE_CATALOG <> VIEW_CATALOG
Run Code Online (Sandbox Code Playgroud)

将 SELECT * 的适当性留给另一个讨论,为什么外部数据库引用不在 INFORMATION_SCHEMA 视图中,有什么方法可以获取它们?

sql-server information-schema sql-server-2014

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

has_unchecked_assembly_data 的重要性由于更改兼容性级别后的持久计算列?

这个数据库有一个持久化的计算列,它是通过调用一个 .NET 函数来计算的。在将兼容性从 MSSQL 2005 更改为 2012 时,出现错误 10334,这看起来更像是警告:它告诉我必须将其中一个表标记为 has_unchecked_assembly_data。

它没有告诉我该怎么做。我应该保持原样吗?我应该以某种方式强制重新计算列吗?如何?

在此处输入图片说明

alter assembly unchecked data 的文档列出了造成这种情况的几个原因,我认为 #1 是唯一适用于该数据库的原因。它也没有解释如何取消标记这些列。

sql-server sql-server-2012 sql-clr

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

强制Sql server在合并连接中使用索引查找

我正在测试 sql server 中的合并加入。我有一个INNER JOIN并强制优化器执行以下操作MERGE JOIN:

  • ID 在个人表中是主键
  • ID 在 Abteilung 表是主键
  • 这些表中没有其他索引

     select * from  [dbo].[Personal] as P inner join [dbo].[Abteilung] as A  
     on  P.[ID]= A.[Personal_ID]   OPTION (MERGE JOIN) 
    
    Run Code Online (Sandbox Code Playgroud)

然后优化器使用这个计划来运行我的查询:

在此处输入图片说明

我想强制优化器使用index seek而不是Table Scan

我为实现这个目标做了什么:

  • 在 Table Abteilung 中的列ID,上定义分组索引Personal_ID。如果我运行查询,执行计划是这样的变化:

在此处输入图片说明

这里我有聚集索引扫描,但没有聚集索引搜索

  • 使用FORCESEEK提示。如果我使用此提示,运行查询会发生错误:

由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示且不使用 SET FORCEPLAN 的情况下重新提交查询。

  • 如果我在查询中添加 where 子句,则查询将更改为:

      select * from  [dbo].[Personal] as P inner join [dbo].[Abteilung] as A  
      on P.[ID]= A.[Personal_ID] where A.[Personal_ID]=2 
      OPTION (MERGE    JOIN) …
    Run Code Online (Sandbox Code Playgroud)

sql-server optimization execution-plan sql-server-2012

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

批量编辑表和列描述

在 StackOverflow 上的一个问题中,我发现了这个查询,它显示了当前数据库中所有表的表和列描述:

SELECT      u.name + '.' + t.name AS [table],
            td.value AS [table_desc],
            c.name AS [column],
            cd.value AS [column_desc]
FROM        sysobjects t
INNER JOIN  sysusers u
    ON      u.uid = t.uid
LEFT OUTER JOIN sys.extended_properties td
    ON      td.major_id = t.id
    AND     td.minor_id = 0
    AND     td.name = 'MS_Description'
INNER JOIN  syscolumns c
    ON      c.id = t.id
LEFT OUTER JOIN sys.extended_properties cd
    ON      cd.major_id = c.id
    AND     cd.minor_id = c.colid
    AND     cd.name = 'MS_Description'
WHERE t.type = 'u'
ORDER BY    t.name, …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2014

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

SQL Server 数据库迁移 - 在原始数据库仍在生产中时进行备份/恢复

我在完全恢复模式下有一个非常大的数据库。我的 SQL Server 是 2008 R2。问题是我需要迁移到新服务器,同时原始数据库仍在生产中。

备份和恢复都需要几个小时,所以...

  • 备份时添加到数据库中的记录会发生什么变化?如果我是对的,这不是问题,.bak文件将包含所有数据,直到备份结束。我是否标记了仅复制?

  • 备份完成后,我开始恢复......在新服务器中恢复时获取已添加到原始数据库的其余记录的最佳选择是什么?

我试过全+差分,但我收到一条消息

无法恢复差异备份,因为数据库尚未恢复到正确的早期状态

在我的测试环境中。

可以肯定这是最后一次完整备份,因为我只是在修改一条记录后一分钟后才进行备份。

另外,我用 norecovery 恢复完整,用 recovery 恢复差异。

我做错了什么?

备份将备份到磁盘,因为我需要尽快完成。

编辑:

我仍然收到消息“无法恢复差异备份,因为...”。有什么问题?

备份到磁盘时我必须做一些特别的事情吗?这些是 LSN:

+------------+--+-------------------+--+-------------------+--+-------------------+--+-------------------+-
| BackupType |  |     FirstLSN      |  |          LastLSN  |  | CheckpointLSN     |  | DatabaseBackupLSN | 
+------------+--+-------------------+--+-------------------+--+-------------------+--+-------------------+-
| FullBackup |  | 99000000025100209 |  | 99000000034000001 |  | 99000000033800001 |  | 98000002545900051 | 
| DiffBackup |  | 99000000033800001 |  | 99000000036800001 |  | 99000000035000041 |  | 98000002545900051 | 
+------------+--+-------------------+--+-------------------+--+-------------------+--+-------------------+-
Run Code Online (Sandbox Code Playgroud)

sql-server backup migration sql-server-2008-r2 restore

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

尝试删除子查询并仅使用 WHERE 返回某些行时出现问题

我对 SQL 查询非常陌生。我正在为 Microsoft 70-461 学习并找到一个我认为可以简化的示例,但是我的版本返回了错误的结果,我想了解原因。

本学习指南显示了这个查询:

USE TSQL2012;
SELECT productid, productname, unitprice, P.supplierid
FROM Production.Products AS P
WHERE supplierid IN
    (SELECT supplier
     FROM Production.Suppliers
     WHERE country = N'Japan');
Run Code Online (Sandbox Code Playgroud)

正确返回 6 行,我的查询:

USE TSQL2012;
SELECT productid, productname, unitprice, P.supplierid
FROM Production.Products AS P, Production.Suppliers AS S
WHERE S.country = N'Japan':
Run Code Online (Sandbox Code Playgroud)

返回 231 行,production.products 表只包含 70 行开始,所以我不明白。有人可以告诉我我在俯瞰什么。先感谢您。

示例数据库“TSQL2012”可在此处下载。

sql-server

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