标签: syntax

什么允许 SQL Server 用对象名称交换传递给系统过程的字符串

是什么导致将对象名称传递给系统存储过程是合法的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

13
推荐指数
1
解决办法
349
查看次数

嵌套在 OUTER JOIN 中的 INNER JOIN 的语法与查询结果

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)

在此处输入图片说明

join sql-server syntax sql-server-2012

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

在 PostgreSQL 中引用带有空格的列?

我将数据库从 SQL Server 迁移到 PostgreSQL。

大多数列名包含双字,例如:

SELECT [Column Name] FROM table;
Run Code Online (Sandbox Code Playgroud)

...这在 PostgreSQL 中不起作用。

PostgreSQL 的正确语法是什么?

postgresql syntax

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

我们可以在 Transact-SQL 中的聚合函数后放置等号 (=) 吗?

我遇到过这样的脚本:

set @sum = sum = (case when somecol1 is null then DATEDIFF(d,[somecol2],somecol3) else 0 end)
Run Code Online (Sandbox Code Playgroud)

我无法理解第二个关键字 sum 后面的等号 (=) 的含义。当我运行查询时,它没有显示任何带有等号和不带等号的错误。

我想知道在关键字后面放一个等号的目的sum。这是错误还是错误?

谢谢

sql-server syntax aggregate t-sql

11
推荐指数
1
解决办法
872
查看次数

使用 CREATE TABLE AS SELECT 如何指定 WITH 条件 (CTE)?

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 语法来做到这一点。

postgresql syntax cte sql-standard ctas

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

PostgreSQL 在查询 INSTEAD OF 触发器时使用 NEW

我无法让 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)

postgresql trigger syntax plpgsql

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

是否有任何 SQL 方言允许 SELECT 子句的逻辑顺序?

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 …

syntax

8
推荐指数
1
解决办法
522
查看次数

如何在 PostgreSQL 中编写十六进制文字?

你如何在 PostgreSQL 中编写十六进制文字?就像说我想要0xCC,如果我这样做;

SELECT 0xCC;
 xcc 
-----
   0
(1 row)
Run Code Online (Sandbox Code Playgroud)

所以 PostgreSQL 将 解析xcc为别名。

postgresql syntax

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

为什么我不能直接调用我的 UDF?为什么我需要将它限定为 3 个级别?

我刚刚创建了一个 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)

sql-server-2005 sql-server syntax functions

7
推荐指数
1
解决办法
377
查看次数

在单个结果中连接一对多字段?

假设我有以下查询:

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)

sql-server-2008 join syntax group-concatenation

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