我可能已经看这个太久了,无法弄清楚这一点......
下面的函数用于提取有关 SQL Server 实例的一个或多个数据库的信息。到目前为止,我知道这适用于 SQL 2005 及更高版本。
我已经使用过,Format-Table但最终会切断列。我使用了Output-Filewhich 可以工作但默认为列表视图,这可能很难进入 Excel。它还会切断超过一定长度的列数据。
编辑:此功能的目的是针对 100 多台服务器运行它以收集每个实例的清单。
PowerShell 功能:
# Load SMO
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')
function Get-DatabaseInfo ($server,$dbname)
{
$srv = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $server
$db = $srv.Databases.Item($dbname)
$DataFile = $db | Select -ExpandProperty FileGroups | Select -ExpandProperty Files
$LogFile = $db | Select -ExpandProperty LogFiles
$tables = $db | Select -ExpandProperty tables | ? {$_.IsSystemObject -eq $false}
$indexes = $tables | Select -ExpandProperty Indexes | ? …Run Code Online (Sandbox Code Playgroud) 我编写了这个函数,它应该遍历文本数组并将每个元素(这是一个类型转换的整数)转换为十六进制,附加到文本变量,然后返回十六进制。然而,我什么也得不到。
有没有人看到该函数有任何问题会导致它不返回任何内容?
CREATE OR REPLACE FUNCTION array_convert_to_hex(text[])
RETURNS text
AS
$$
DECLARE
arrInts ALIAS FOR $1;
retVal text;
BEGIN
FOR I IN array_lower(arrInts, 1)..array_upper(arrInts, 1) LOOP
retVal := retVal || lpad(cast(to_hex(arrInts[I]::integer) as varchar), 2, '0');
END LOOP;
RETURN retVal;
END;
$$
LANGUAGE plpgsql
STABLE
RETURNS NULL ON NULL INPUT;
Run Code Online (Sandbox Code Playgroud) 我有一个 oracle 表,其中日期存储为自特定日期以来的分钟数。它看起来像这样:
CREATE TABLE MY_TABLE
(
SOMETHING NUMBER(15,1) NOT NULL,
START_MINUTE NUMBER(15,1) NOT NULL,
STOP_MINUTE NUMBER(15,1) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我编写了两个函数来在所谓的“分钟”和它们代表的实际日期/时间之间进行转换。它们看起来像这样:
CREATE OR REPLACE FUNCTION FROM_MINUTE (MINUTE_IN IN NUMBER)
RETURN DATE AS
BEGIN
/* Minute 0 = 12/30/1899 12:00am */
RETURN (TO_DATE('1899-12-30', 'YYYY-MM-DD') + (MINUTE_IN / 1440));
END FROM_MINUTE;
CREATE OR REPLACE FUNCTION TO_MINUTE (DATE_IN IN DATE)
RETURN NUMBER AS
BEGIN
/* Minute 0 = 12/30/1899 12:00am */
RETURN
(TRUNC(DATE_IN, 'DD') - TO_DATE('12/30/1899', 'MM/DD/YYYY')) * 1440 +
TO_NUMBER(TO_CHAR(DATE_IN, 'HH24')) * …Run Code Online (Sandbox Code Playgroud) 表演时
RETURN QUERY ...
Run Code Online (Sandbox Code Playgroud)
在 PL/pgSQL 函数中,之后是否可以直接访问累积到记录堆中的行数,在函数结束时返回这些行数?
例子:
RETURN QUERY SELECT * FROM tableA; -- 14 records
RETURN QUERY SELECT * FROM tableB; -- 8 records
RETURN QUERY SELECT * FROM tableC; -- 22 records
Run Code Online (Sandbox Code Playgroud)
累积记录的数量现在应该是 44。
根据查询性能和多语句表值函数等文章,SQL Server 假设多行表值函数返回一行。如果它实际上返回许多行,这会导致为调用语句选择一个糟糕的执行计划。
添加SCHEMABINDING到函数是否会导致函数返回值集的基数估计更正确?
如果我们假设我们将一个UserId传递给这个函数并返回一个RecordId值的表,该表允许用户访问,并且一些用户只被允许查看一些记录,而一些用户被允许查看很多甚至所有记录,函数或调用语句(或包含它们的过程)是否会从使用中受益RECOMPILE?SCHEMABINDING函数中的使用会改变这个答案吗?
我意识到我可以通过实验来解决这个问题,但我希望有人已经找到了答案。指向有详细记录的地方的指针会有所帮助。
我必须调查一个 MySQL 生产服务器,在调查时我发现一个DELETE查询的状态"SHOW PROCESSLIST"超过 400 秒preparing,我试图在慢日志中找到查询,但我无法在慢日志中找到查询。
mysql> show full processlist;
+------+-----------------+---------------------+-----------+---------+------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------+-----------------+---------------------+-----------+---------+------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 2 | event_scheduler | localhost | NULL | Daemon | 204 | Waiting for next activation | NULL |
| 7229 | root | 192.168.1.178 | mydb | Connect | 204 | preparing | DELETE
FROM TEST_DATA_1
WHERE ID in
(SELECT ID
FROM …Run Code Online (Sandbox Code Playgroud) 我在 2 个不同的服务器(.246 和 .252)中有 2 个数据库。我需要为 252 服务器中的所有存储过程、触发器和函数创建备份,并在 246 服务器中恢复它。两台服务器中的数据库名称都是 transcredit。252台服务器中大约有500SP。谁能帮我?
在触发器主体中,如何NEW通过其字段名称为其分配值?
这就是我想要做的:
some_key = "some_column";
NEW[some_key] = 5;
Run Code Online (Sandbox Code Playgroud) 好吧,我可能会因为第二次问同样的问题而被禁止,但我在这里是一个令人难以置信的新手,我被告知我没有足够的声誉来评论原始问题。
我同意 OP (Matt Fenwick) 在如何创建用户定义的聚合函数中回答 5 的评论。因为它给了一条鱼一天,但真正的问题是学习如何钓鱼。
我需要一个 GROUP BY 聚合函数,例如 MIN 函数,但是在调用 SMALL(t.value, 2) 时它返回第二小的数据元素,在调用 SMALL(t.value, 3) 时它返回第三个最小的数据元素,等等。(这实际上适用于 LibreOffice Calc 的 SMALL 函数,顺便说一句。)
我提出这个问题的特殊原因的问题是我想将大学课程的评分电子表格转换为 MySQL 数据库,并且我需要删除两个最低的出勤分数、两个最低的作业分数和两个最低的测验每个学生的分数,以计算他们调整后的出勤率、调整后的家庭作业平均值和调整后的测验平均值,以及对数据的其他调整。
tblQuizzes 看起来像
mysql> select * from tblQuizzes LIMIT 12;
+------------+---------+-----------+
| StudentKey | QuizKey | QuizGrade |
+------------+---------+-----------+
| 1 | 1 | 0.123 |
| 2 | 1 | 0.456 |
| 3 | 1 | 0.789 |
| 4 | 1 | 0.890 |
| 5 …Run Code Online (Sandbox Code Playgroud) 我需要一个计算列来解决隐式转换问题。我有一个声明为 VARCHAR 的列,它应该只存储整数,但偶尔会被带有字符串的第三方应用程序错误填充,因此该列需要保持原样。
该表通常连接到一个将该值存储为 INT 的表。我定义了一个 PERSISTED 计算列,用于将该 VARCHAR 转换为 INT:
[iOrderNumber] AS (CONVERT([int],
case
when [ordernumber] like '#%' then (-99) when isnumeric([ordernumber])=(0) then (-99)
when CONVERT([bigint],[ordernumber],(0))>(2147483647) then (-99)
else [ordernumber]
end,(0))) PERSISTED NOT NULL
Run Code Online (Sandbox Code Playgroud)
使用计算列上的适当索引,现在可以连接到 INT 列的查询的性能显着提高。但是,即使在更新表而不是读取表时发生转换,执行计划仍会显示隐式转换警告。
我尝试在计算列定义中使用 UDF 来消除警告(我找到了一篇建议这样做的博客文章),但随后我的查询的执行时间更长,并且使用了更多的 CPU,尽管逻辑读取保持不变。但是 UDF 确实消除了警告。
除了错误之外,还有其他理由考虑警告吗?是否有理由将优化器对使用 UDF 定义的持久计算列的处理视为错误?
更重要的是,有没有办法摆脱警告,而不会招致 UDF 解决方案的性能损失?
我考虑使用触发器和包含数据的 VARCHAR 和 INT 版本的转换表,而不是使用计算列,但这似乎是很多不必要的开销。
functions ×10
sql-server ×4
postgresql ×3
trigger ×3
mysql ×2
plpgsql ×2
backup ×1
oracle ×1
powershell ×1
smo ×1
warning ×1