小编Pau*_*ite的帖子

添加非空列

我有一个现有的表,我在其中添加了一个NgoId数据类型为int. 我想NOT NULL在列中添加 as 。

当我添加这个时,我收到以下错误:

无法修改表。无法将值 NULL 插入列“NgoId”、表“CSR.dbo.Tmp_tbl_post_category”;列不允许空值。插入失败。该语句已终止。

请帮助如何添加 NOT NULL 列。

sql-server sql-server-2008-r2 ddl

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

使用 IDENTITY_INSERT 时身份种子增加

在 SQL Server 2008 上运行此代码段会产生与在 SQL Server 2014 上不同的结果。我需要它们产生相同的结果。

我的场景是我正在编写单元测试(使用 tsqlt),而这段代码是我试图测试的一个巨大过程的一部分。在我的测试代码中,我可以做任何事情,因为该代码永远不会投入生产。这个“错误”在生产中不会造成损害,但在编写测试时给我带来了问题。意思是,我不想更改代码,只想更改测试。

我的本地开发环境是 SQL Server 2014,但我们的一些 CI 环境仍然是 SQL Server 2008。

  • 我的第一个问题是是否有任何方法可以避免 2008 年出现此(错误)?
  • 我的第二个问题是,是否有任何方法可以使 2014 年的行为与 2008 年相同,从而使测试在 2008 年和 2014 年都通过。任何设置或跟踪标志或黑客?

我目前的技巧是在服务器是 2008 的情况下将表重新设置为 0(而不是 1)。我不喜欢这样,因为当我们的环境升级时我需要更改它或删除它。

IF CHARINDEX('2008', @@VERSION) > 0 BEGIN
        -- HACK to fix identity bug in SQL 2008.
        DBCC CHECKIDENT('...peter', RESEED, 0);
END
Run Code Online (Sandbox Code Playgroud)

麻烦的代码:

IF OBJECT_ID('tempdb..#peter') IS NOT NULL DROP TABLE #peter;
CREATE TABLE #peter(ID INT IDENTITY(1, 1), VALUE CHAR(10));

SET IDENTITY_INSERT #peter ON;
INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

sql-server identity

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

SQL Server 2016中TempDB默认文件数

注意到 SQL Server 2016 CTP2 的文档声明“默认情况下,安装程序添加与 CPU 数量或 8 一样多的 tempdb 文件,以较低者为准”。 https://msdn.microsoft.com/en-us/library/bb510411(v=sql.130).aspx

但我一直认为“正确”的比例应该是 CPU 核心数量的一半,对于 8 核心以下的机器来说。

这是否应该被视为微软的官方建议,甚至适用于2012/2014年?

sql-server configuration tempdb sql-server-2016

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

如何将 RELATIONAL 数据分解为 HIERARCHY 数据结构?

我有一个返回以下数据集的查询:

RELATIONid MAPid  D1id   D2id  D3id
4999       4999   626    1250    7 
5000       5000   626    1250    8
Run Code Online (Sandbox Code Playgroud)

对于下一步,我需要将这些数据集绑定到树视图(层次结构)中。我需要将此数据集转换为以下内容:

Nodeid   ParentNodeid  Header
626       null           D1
1250      626            D2
7         1250           D3
8         1250           D3 
Run Code Online (Sandbox Code Playgroud)

我如何从原始数据集中实现这些结构?


我还有一个问题要问,数据结构比前一个复杂(一点点)。假设我有这样的示例数据集:

RELATIONid MAPid  D1id   D2id  D3id
4999       4999   626    1250    7 
5000       5000   626    1250    8
5001       5001   627    1300    10 
5002       5002   627    1300    12 
5003       5003   628    1400    15 
Run Code Online (Sandbox Code Playgroud)

从以下数据集中,我们有 3 个 MainParent:626, 627, 628并且转换(交叉应用)输出期望将是这样的:

Nodeid   ParentNodeid  Header
626       null           D1
1250      626 …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server hierarchy

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

在 WHERE 子句中使用 CASE 表达式时,列不存在

我有这个 SQL

SELECT 
    price_amount, 
    price_currency, 
    CASE 
        WHEN price_currency='USD' THEN price_amount * 3.9024 
        WHEN price_currency='EUR' THEN price_amount * 4.413 
        WHEN price_currency='ILS' THEN price_amount * 1 
        ELSE price_amount * 1 
    END AS final_price 
FROM items 
WHERE final_price BETWEEN 1 AND 100
Run Code Online (Sandbox Code Playgroud)

但我得到:

错误:“final_price”列不存在第
1 行:...ce_amount * 1 END AS final_price FROM items WHERE final_pric...

它使用别名被选中,那么为什么它试图在表中找到它?

postgresql

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

从 INSERT .. SELECT 中的 SELECT 表返回值

我有一个看起来像这样的表:

| column | def  |
| ------ | ---- |
| id     | uuid |
| status | int  |
| data   | text |
Run Code Online (Sandbox Code Playgroud)

我想编写一个查询来复制一行(仅更改几列)并返回旧的(替换的)数据:

INSERT INTO tmp (status, data)
SELECT source.status, :data
FROM table AS source
WHERE id = :id
RETURNING id, source.data
Run Code Online (Sandbox Code Playgroud)

RETURNING只能访问插入行中的值,是否有其他方法可以做到这一点?

postgresql

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

找到每个阶段的获胜者

我正在学习 SQL,我正在努力找一份工作。我在 MS SQL Server 2014 中有下表:

该表名为 Game,具有以下字段:Name、Stage #、Score。

我的目标是用他/她的名字写出每个阶段的获胜者(阶段的获胜者是获得最高分的人)。

这是原始表:

Name    Stage #         Score
George     A              10
Joe        A              10
Pete       A               9
Jane       B               7
Sally      B               6
Run Code Online (Sandbox Code Playgroud)

输出应该如下所示:

Winner Name    Score         Stage
George           10             A
Joe              10             A
Jane              7             B
Run Code Online (Sandbox Code Playgroud)

我怎样才能完成这个任务?一位同事向我推荐了http://sqlfiddle.com/以帮助我解决这个问题,但该网站显然不适用于 MS SQL Server 2014 或 MS SQL Server 2008。因此,我可以在这里获得一些帮助吗?

我了解一些基本功能,例如 SELECT、WHERE、GROUP BY、JOIN 和 HAVING,但我无法将它们放在一起以获得我想要的正确的三行输出。

sql-server sql-server-2014

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

我应该为每种数据类型设置一列还是存储所有内容的 1 列

我有一个当前看起来像这样的数据库表:

PageField
-Id (Int, PK)
-FieldType (String) Can be Text, Decimal, Integer or Bit
-Value (This stores the value regardless of the FieldType, so it is not strongly typed)
Run Code Online (Sandbox Code Playgroud)

我是否应该删除Value列并将其替换为 4 个单独的列TextValueDecimalValueIntegerValueBitValue吗?

数据类型将设置为相关内容。这意味着在这 4 列的每一行中,第 3 列将是NULL.

database-design eav

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

在sql中将日期平均值转换为日期时转换失败

我已经从日期中取平均日期并试图获得平均日期的结果,但它引发了如下错误: Conversion failed when converting date and/or time from character string.

sql查询执行为:

select 
CONVERT
(
    DATE,
    LEFT(
          convert(
                  varchar(10),
                  AVG(
                        convert(
                                 int, 
                                 convert(
                                           varchar(10), 
                                           OnMarkDate, 
                                           112
                                         )
                                 )
                       )
                  ),8
          )
)
from @tbl_XMLResult
Run Code Online (Sandbox Code Playgroud)

列值如下:

   '2001-10-11',
   '2001-10-03',
   '2001-09-24',
   '2000-05-31',
   '2001-10-15',
   '2008-01-01'
Run Code Online (Sandbox Code Playgroud)

数据类型为日期。

sql-server sql-server-2012 date

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

按基于类别的多列值返回不同的记录

ID    MODEL    MODELSTATUS    CONTROL
11     100      GOOD           XN
24     100      TRENDING       BF
33     101      GOOD           XN
46     102      BAD            BF
50     103      BAD            XN
64     103      BAD            BF
77     104      PENDING        XN
89     104      TRENDING       BF
92     105      TRENDING       BF
93     105      TRENDING       XN
Run Code Online (Sandbox Code Playgroud)

鉴于上面的数据,我将如何返回下面的结果。可以有 1 条或 2 条(最多)具有相同 MODEL 的记录。如果 MODEL 有 2 个记录,则 CONTROL 将不同。

如果 MODESTATUS 为“趋势”,则返回该记录。否则,如果 MODELSTATUS 是 'Pending' 或 'Bad' 返回该记录。否则,如果 MODEL 有 2 条记录,其中 MODELSTATUS 与 CONTROL 的返回记录相同,则为“XN”

ID    MODEL    MODELSTATUS    CONTROL
24    100 …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2014

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