是什么导致将对象名称传递给系统存储过程是合法的sp_helptext?
什么机制将对象名称转换为字符串?
例如
-- works
sp_helptext myproc
sp_helptext [myproc]
sp_helptext [dbo.myproc]
-- and behaves the same as a string
sp_helptext 'myproc'
sp_helptext 'dbo.myproc'
-- does not work
sp_helptext dbo.myproc -- Msg 102, Level 15, State 1, Line 1 incorrect syntax near '.'
-- an additional case that does not work.
sp_helptext [dbo].[myproc] -- Msg 102, Level 15, State 1, Line 1 incorrect syntax
Run Code Online (Sandbox Code Playgroud)
我不需要单引号有效的.过程名称似乎很奇怪,除非它具有分隔模式名称和过程名称。我正在寻找有关如何将其从带引号的名称自动转换为要作为参数值传递的字符串文字的解释。
我没有要解决的具体问题;我只是对没有记录的事情感到好奇。
sql-server stored-procedures syntax parameter database-internals
TLDR;如果您查看 2 个执行计划,是否可以轻松回答哪个更好?我故意没有创建索引,所以更容易看到发生了什么。
继续我之前的问题,我们发现不同连接样式(即嵌套与传统)之间的查询性能差异,我意识到嵌套语法也会修改查询的行为。考虑以下 2 个查询。
SELECT a.*, m.*, n.*
FROM dbo.Autos a
LEFT JOIN dbo.Models m
JOIN dbo.Manufacturers n -- <-- Nested INNER JOIN
ON n.ManufacturerID = m.ManufacturerID
ON m.ModelID = a.ModelID
Run Code Online (Sandbox Code Playgroud)

这并不一定使制造商加入,以包括与ModelID自动行是不是在型号表。

使用传统语法,我们必须将 Manufactures 的连接更改为外部连接,就像这样……但这会改变查询计划。
SELECT a.*, m.*, n.*
FROM dbo.Autos a
LEFT JOIN dbo.Models m
ON m.ModelID = a.ModelID
LEFT JOIN dbo.Manufacturers n -- <-- Now LEFT OUTER JOIN
ON n.ManufacturerID = m.ManufacturerID
Run Code Online (Sandbox Code Playgroud)

我将数据库从 SQL Server 迁移到 PostgreSQL。
大多数列名包含双字,例如:
SELECT [Column Name] FROM table;
Run Code Online (Sandbox Code Playgroud)
...这在 PostgreSQL 中不起作用。
PostgreSQL 的正确语法是什么?
我遇到过这样的脚本:
set @sum = sum = (case when somecol1 is null then DATEDIFF(d,[somecol2],somecol3) else 0 end)
Run Code Online (Sandbox Code Playgroud)
我无法理解第二个关键字 sum 后面的等号 (=) 的含义。当我运行查询时,它没有显示任何带有等号和不带等号的错误。
我想知道在关键字后面放一个等号的目的sum。这是错误还是错误?
谢谢
PostgreSQL 中有一个旧的和不推荐使用的命令,它早于CREATE TABLE AS SELECT(CTAS)称为SELECT ... INTO .... FROM,它支持WITH子句/公共表表达式(CTE)。所以,例如,我可以做到这一点..
WITH w AS (
SELECT *
FROM ( VALUES (1) ) AS t(x)
)
SELECT *
INTO foo
FROM w;
Run Code Online (Sandbox Code Playgroud)
但是,我不能这样做..
WITH w AS (
SELECT *
FROM ( VALUES (1) ) AS t(x)
)
CREATE TABLE foo AS
SELECT * FROM w;
Run Code Online (Sandbox Code Playgroud)
或者,我得到
ERROR: syntax error at or near "CREATE"
LINE 5: CREATE TABLE foo AS
Run Code Online (Sandbox Code Playgroud)
我将如何使用标准化的 CTAS 语法来做到这一点。
我无法让 INSTEAD OF 触发器正常工作,而且我想我误解了如何使用 NEW。考虑以下简化场景:
CREATE TABLE Product (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR
);
CREATE TABLE Purchase (
purchase_id SERIAL PRIMARY KEY,
product_id INT REFERENCES Product,
when_bought DATE
);
CREATE VIEW PurchaseView AS
SELECT purchase_id, product_name, when_bought
FROM Purchase LEFT JOIN Product USING (product_id);
Run Code Online (Sandbox Code Playgroud)
我希望能够创建INSTEAD OF触发器以允许我直接插入到 中PurchaseView,例如:
INSERT INTO Product(product_name) VALUES ('foo');
INSERT INTO PurchaseView(product_name, when_bought) VALUES ('foo', NOW());
Run Code Online (Sandbox Code Playgroud)
我的想法是这样的:
CREATE OR REPLACE FUNCTION insert_purchaseview_func()
RETURNS trigger AS
$BODY$
BEGIN
INSERT INTO Purchase(product_id, when_bought) …Run Code Online (Sandbox Code Playgroud) SELECT 在 ISO/IEC 标准中,SQL 为子条款规定了以下语法顺序:
SELECT
projection-expressions
FROM
sources
WHERE
predicate-expression
GROUP BY
key-expression
HAVING
predicate-expression
ORDER BY
ordering-expressions
Run Code Online (Sandbox Code Playgroud)
虽然逻辑执行顺序是这样的:
FROM
sources
WHERE
predicate-expression
GROUP BY
value-expression
HAVING
value-expression
SELECT
projection-expressions
ORDER BY
ordering-expressions
Run Code Online (Sandbox Code Playgroud)
对于 SQL 的新手用户来说,即使它是首先声明的,在SELECT子句中定义的投影在WHEREor子句中不可用,这变得令人惊讶GROUP BY- 考虑到计算机程序通常遵循自上而下的执行顺序。
同样令人惊讶的是,SQL 作者需要在、 和子句中重复他们的表达式SELECT,或者使用不适合简洁查询的子查询。至少当用户熟悉实际的子句执行顺序时,他们知道为什么需要重复自己,但这并不能阻止它令人沮丧。WHEREGROUP BY
这个问题和其他相关问题记录在我发现的这篇文章中:https : //blog.jooq.org/a-beginners-guide-to-the-true-order-of-sql-operations/,这并不奇怪StackOverflow 上的 QA 有近 30,000 次查看:https : //stackoverflow.com/questions/3241352/using-an-alias-column-in-the-where-clause-in-postgresql
这让我想知道是否有任何 SQL 实现允许这种更“合乎逻辑”的子句排序。我注意到 .NET 中的 Linq 实际上确实遵循这个顺序,虽然我不会将它描述为真正的 SQL 实现,但实际上,在 Linq …
你如何在 PostgreSQL 中编写十六进制文字?就像说我想要0xCC,如果我这样做;
SELECT 0xCC;
xcc
-----
0
(1 row)
Run Code Online (Sandbox Code Playgroud)
所以 PostgreSQL 将 解析xcc为别名。
我刚刚创建了一个 UDF 并对其进行了测试,我发现只有在使用此语法时才有效
SELECT [PMIS].[dbo].[fnIsReportingTo] (50,1132)
Run Code Online (Sandbox Code Playgroud)
我期待它像这样工作:
select * from fnIsReportingTo (50,1132)
Run Code Online (Sandbox Code Playgroud)
或者
select fnIsReportingTo (50,1132)
Run Code Online (Sandbox Code Playgroud)
这是我的创建 SQL:
create function fnIsReportingTo
(
@BossID int,
@EmployeeID int)
RETURNs bit
AS
begin
declare @ret bit
if exists (select * from dbo.fnGetEmployeeHierarchy(@BossID) where employeeID=@employeeID)
select @ret=1
else
select @ret=0
return @ret
end
Run Code Online (Sandbox Code Playgroud) 假设我有以下查询:
SELECT *
FROM AppDetails, AppTags
WHERE AppDetails.AppID = '1'
AND AppDetails.AppID = AppTags.AppID
Run Code Online (Sandbox Code Playgroud)
这给出了以下结果:
AppID AppName AppType Tag
1 Application1 Utility Test1
1 Application1 Utility Test2
1 Application1 Utility Test3
Run Code Online (Sandbox Code Playgroud)
如何修改查询以返回如下内容:
AppID AppName AppType Tags
1 Application1 Utility Test1,Test2,Test3
Run Code Online (Sandbox Code Playgroud) syntax ×10
postgresql ×4
sql-server ×4
join ×2
aggregate ×1
ctas ×1
cte ×1
functions ×1
parameter ×1
plpgsql ×1
sql-standard ×1
t-sql ×1
trigger ×1