SQL Server - 在多个实例上的多个数据库上运行相同查询的最佳方法是什么?例如,我们有许多应用程序数据库,具有相同的架构,需要聚合信息。
我目前使用的脚本依赖于已设置的链接服务器和一个用于标识要循环的实例和数据库的表。
/* 声明一些游标变量和动态sql字符串变量 */
声明 @currentDB nvarchar(64)
声明 @connectionstring nvarchar(256)
声明 @sqlstring nvarchar(max)
CREATE TABLE #TEMP1
(
currentDB varchar(32)
,field1 varchar(128)
,field2 smallint
,field3 datetime
)
/* Build and open the cursor */
DECLARE connectioncursor CURSOR FAST_FORWARD
FOR
SELECT currentDB, connectionstring
FROM [admin].dbo.DatabaseList
WHERE dbtype = 'PROD'
OPEN connectioncursor
FETCH NEXT FROM connectioncursor INTO @currentDB, @connectionstring
/* Start the loop through db list */
WHILE @@FETCH_STATUS = 0
BEGIN
/* Build and set the sql string …Run Code Online (Sandbox Code Playgroud) 我的数据库中有一个以@符号开头的表。我可以使用以下查询成功查询它:
select * from [@tablename]
Run Code Online (Sandbox Code Playgroud)
此格式适用于 SSMS 和 Crystal Reports。
但是,我有一个 C# 应用程序,其中相同的查询在表名上给出“无效的对象名称”错误。
有什么建议么?
我们正在使用商业智能系统,需要加载日期列表,以便我们可以将它们标记为“上周”或“过去 12 个月”或某些动态值。
我想知道虚拟生成一个表的最简单方法是什么,该表仅在一列中列出日期,实际上是从“2014-01-01”到当前日期的每个日期(其他列我可以使用那里的公式)。实际上,甚至将未来的日期附加一年也可能很有用。
现在,是的,我可以从另一个具有数千个条目的随机事实表中获取不同的日期,但这似乎很草率,并且正在创建一种真正不应该存在的依赖关系。
静态游标不允许修改数据,因为它是只读的,并且当使用“Where current of”执行时,它会按预期返回错误。到目前为止,一切都很好。但我惊讶地发现静态游标允许使用这样的变量修改数据。
DECLARE @nome varchar(100), @salario int,@idemp int
DECLARE contact_cursor CURSOR STATIC FOR
SELECT empno,ename, sal FROM emp
OPEN contact_cursor;
FETCH NEXT from contact_cursor into @idemp,@nome, @salario
WHILE @@FETCH_STATUS=0
BEGIN
If @salario < 5000
Update Emp
Set Sal = Sal * 1.1
where empno=@idemp --No error and do the update
--Where current of contact_cursor; --gives error
print @nome+' '+cast(@salario as varchar(100));
Run Code Online (Sandbox Code Playgroud)
FETCH NEXT from contact_cursor into @idemp,@nome, @salario
END
CLOSE contact_cursor;
DEALLOCATE contact_cursor;
Run Code Online (Sandbox Code Playgroud)
问题是:在这次更新中使用“where current”和用光标提取的变量有什么区别? 完整工作的Run_Duration内容。sysjobhistory有办法得到这个吗?[msdb].[dbo].[sysjobactivity]只有最后一步。
据我了解,如果您选择json_value或json_query指定 json 文档中不存在的键或对象,那么在严格模式下,您将收到错误。例如,这使您可以确认文档中是否指定了该密钥。
如果文档中包含示例键值对:
"Test":null
Run Code Online (Sandbox Code Playgroud)
...在严格模式下,这将返回“NULL”。换句话说,您现在知道该键已在文档中定义,并且其值为 null。
现在想象您的文档包含:
"Test":"Some string"
Run Code Online (Sandbox Code Playgroud)
而你查询:
select json_modify(@json, '$.Test', null);
Run Code Online (Sandbox Code Playgroud)
这将返回一个缺少“Test”键的 json 字符串。
如何正确地将键值设置为 null,而不是将其从 json 文档中删除?
(上面的示例可能看起来很荒谬,但我可以想象在将 json 文档传递到下一个查询或系统之前将值设置为 null,并要求文档中存在“Test”键。)
给定一个包含两列的表 - 一个整数 ID 和一个基于文本的字符串 - 我想从一个字符串值开始,该字符串值对用大括号括起来的任意数量的整数进行编码,并与任何其他有效文本字符混合。
例子:'{1} / {9} ... {12}'
通过一条SELECT语句,我想返回一个字符串,其中所有整数(及其大括号)都已替换为从我的表派生的值;具体来说,行的文本值的 ID 与源字符串中找到的数字相匹配......并且大括号之外的任何字符保持不变。
这是一个未能完成任务的示例:
select
replace('{13} {15}','{'+cast(id as varchar)+'}',isNull(display,''))
from testing;
Run Code Online (Sandbox Code Playgroud)
这将在表中每行返回 1 行testing。对于值 = 13 的行id,字符串的“{13}”部分已成功替换,但“{15}”部分未成功替换(第 15 行反之亦然)。
我想创建一个循环所有testing行并重复尝试替换的函数可以解决问题。尽管如此,直接的 SQL 语句比循环语句更好。
示例数据
+----+-------------------+
| id | display |
+----+-------------------+
| 1 | Apple |
| 2 | Banana |
| 3 | Celery |
| 4 | Dragonfruit |
| 5 | Eggplant |
| …Run Code Online (Sandbox Code Playgroud) 在 T-Sql 中,用户有一个默认架构。是否有类似于 postgres search_path 的模式搜索路径概念?
问题背后的问题是,如果我使用模式作为对象的命名空间,这是否意味着在所有代码中使用限定名称?
是否有可能引发在 select 语句中跳过行或多次读取行的情况?例如,我们可能导致阻塞或死锁的方式......
在其中一个存储过程中,我需要捕获实时事件的持续时间。保证永远不会超过 24 小时,因此结果列的数据类型选择为TIME(3)(映射到TimeSpan应用程序端)。计算过程如下:
update tbEvent set tWait= @dtEvent - dEvent - tEvent [where idEvent = @idEvent]
Run Code Online (Sandbox Code Playgroud)
此处dEvent和tEvent先前设置为dtEvent(原始事件@dtEvent的时刻)的日期和时间部分,并且是后续关闭事件的时刻。因此,我从 DATETIME 变量中减去 DATE 和 TIME 列值,并将结果填充到 TIME 列中。
[合理吗?] 预期行为: SQL 将每个表达式项隐式转换为 DATETIME,执行减法,然后通过简单地删除 DATE 部分将结果隐式转换为 TIME。 这一直有效! 嗯, - 到目前为止..
一个更新脚本突然在 SQL 2016 (13.0.1742.0) 上产生了一个错误:
System.Data.SqlClient.SqlException (0x80131904):
The data types datetime and date are incompatible in the subtract operator.
Error Number:402,State:1,Class:16
Run Code Online (Sandbox Code Playgroud)
但是相同的脚本在 2008 R2 (10.50.2500.0) 和 2019 (15.0.2080.9) 上运行良好! …