标签: t-sql

出现哪些问题,将所有 varchar 参数的大小声明为存储过程中的最大值?

这个问题,似乎其他网站也有随着时间的推移增加列大小的问题。

仅增加表中列的大小是一项相当简单的任务。

但是,当您的商店遵守存储过程参数的长度必须与相应表列的长度相匹配的规则时,通过您的存储过程进行的大量更改就会下降。

锁定在 Oracle 显示,该过程不需要知道 varchar2 参数的长度。

当您将每个 varchar 参数声明为 varchar(max) 或 nvarchar(max) 时,其优缺点是什么?

显然,您可以忘记每次增加色谱柱尺寸时都必须调整程序的维护噩梦。

对 SQLRockStar 的回答: 我想保留一个相当保守的表设计,其中已知长度有限的字段根据当前限制建模,而不为将来可能的扩展保留。

我的许多表都包含一个 id int、一个代码 varchar(30) 和一个描述列 varchar(255)。

代码字段必须反映不同客户的本地命名约定。

一些客户需要将此字段增加到 50。

当我不将长度编码到程序参数中时,我只需要调整这个单一客户的表列。

当我坚持将长度编码到参数中时,那么我要么支持不同客户的不同版本的程序,要么我不得不更改并将更改推出给所有客户。

例子

-- SQL Server
Create Table dbo.SQLServerTable (
    id int identity(1,1) primary key not null,
    code varchar(30) not null,
    description varchar(255) not null
);
go
Create Procedure WrapInsertSQLServer1 (
    @code varchar(30),
    @description varchar(255)
) as
INSERT INTO SQLServerTable values (@code, @description);
go      

Create Procedure WrapInsertSQLServer2 (
    @code …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 varchar t-sql

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

为什么 OUTPUT INTO 子句的目标不能是视图?

这是我的声明:

DELETE FROM table1 OUTPUT deleted.col1,deleted.col2 INTO view1;

它给了我这个错误:

OUTPUT INTO 子句的目标“view1”不能是视图或公用表表达式。

该视图简单且可更新。为什么我不能使用 OUTPUT 子句插入可更新视图?

sql-server-2008 sql-server t-sql

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

SELECT INTO 创建一个新表?

我有一个MessageQueue六列的原始表格。当我尝试对该表执行 SELECT INTO 时,<network domain\user name>.MessageQueue当我使用以下代码时,它会创建一个仅包含三列的新(本地)表。我究竟做错了什么?

declare 
    @TempTable table (idx smallint Primary Key IDENTITY(1,1), OneId int, OtherId int)

declare 
    @OneId int,
    @OtherId int,
    @date datetime = dbo.GetFloorDate(getdate()),
    @i int = 1

insert @TempTable select Id, OtherId from One where @date = (select dbo.GetSomeDate (Id))

select MessageId = 9999, OneId, OtherId into MessageQueue from @TempTable

select * from MessageQueue
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

如何将计数分组?

我有一个按顺序排列的位字段的记录,我如何将它们分组为 3 组。例如,如果我的前三行有位字段 0,1,0 我希望它们在组 0 中,接下来的 3 是 1, 0,0 我希望它们在第 1 组中。接下来的三个是 0,0,1,我希望它们在第 2 组中。

顺序很重要,因为我正在匹配模式表以获得二进制模式的总体计数。

我可以看到 Row 会有所帮助,但我不知道如何按 3ss 计算行数。

谢谢你。

sql-server t-sql

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

如何在USE语句中使用局部变量

如何在USE语句中使用局部变量?我得到错误:

消息 911,级别 16,状态 1,第 6 行
数据库“DWSource_@Country”不存在。确保正确输入名称。

代码:

DECLARE @Country varchar(3)
SET @Country='UKR'

USE DWSource_@Country

SELECT  @Country as country,
        count(*) as n_ALL,
        sum(case when LEN(EPOSTA)>0 then 1 else 0 end) as EMAIL1,
        sum(case when LEN(EPOSTA_2)>0 then 1 else 0 end) as EMAIL2

FROM    [dbo].[_data_CRM_S_PARTNER] 
WHERE   VIR = 'SM'
    AND PRAVNA_OSEBA = 0
    AND PROBLEMATICEN = 0   
    AND ISNULL([STATUS],0) IN (0,1) 
    AND ID_DBCLUSTER IN ('112','122','132','212','222','232','312','322','332','311','321','331')
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Br, 安雅

sql-server t-sql

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

INSTEAD OF INSERT 触发器内的 SET IDENTITY_INSERT 不起作用

我正在尝试在而不是插入触发器中执行身份插入,但是当我尝试将数据插入数据时,它会抛出错误消息“消息 544,级别 16,状态 1,第 36 行无法插入身份的显式值IDENTITY_INSERT 设置为 OFF 时表 'PixTest' 中的列。”。

我正在使用安装在 Windows 8 64 位上的 SQL SERVER 2014 Developer Edition 64 位。

以下是一些可能有帮助的示例代码:

CREATE TABLE PixTest
(
      ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
      TESTE VARCHAR(10)
)
GO

CREATE TRIGGER AutoIncrement_Trigger ON PixTest
instead OF INSERT AS
BEGIN

    DECLARE @ID INT;
    SELECT @ID=ID FROM inserted;



    IF COALESCE(@ID,0)<> 0
        BEGIN

            SET IDENTITY_INSERT PixTest ON
            INSERT INTO PixTest(ID, TESTE) 
            SELECT ID,TESTE FROM inserted
            SET IDENTITY_INSERT PixTest off

        END

    ELSE

        INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

t-sql

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

计算多个表中值的实例

我正在尝试编写一个查询,该查询返回多个表中给定值的计数。

现在,我正在使用以下查询

SELECT COUNT(*) AS SL,
(
  SELECT COUNT(*)
  FROM [Sales Line Archive]
  WHERE [Document No_] = 123
) AS SLA
FROM [Sales Line]
WHERE [Document No_] = 123
Run Code Online (Sandbox Code Playgroud)

它返回一个结果,第一列是 Sales Line 中的行数,第二列是 Sales Line Archive 中的行数。

但是,我想使用IN子句请求多条记录,以便获得如下结果

Document No_, SL, SLA
1, 3, 0
2, 0, 4
3, 2, 1
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

将行连接成单个字符串查询,运行 5 小时并计数

我有一张有 260 万条记录的表。它看起来像这样:

email                           prject_name
rafael.nadal@xyz.com              lab1
rafael.nadal@xyz.com              lab2
rafael.nadal@xyz.com              lab3
TEST@TEST.COM                     shift1
TEST@TEST.COM                     shift2
Run Code Online (Sandbox Code Playgroud)

但我希望我的桌子看起来像这样:

email                     project_name
rafael.nadal@xyz.com     lab1, lab2, lab3
TEST@TEST.COM            shift1, shift2, shift3
Run Code Online (Sandbox Code Playgroud)

我用过这个查询

select distinct email ,
STUFF((Select ','+project_name
from dbo.[UMG sent 2016] as  T1
where T1.email=T2.email
FOR XML PATH('')),1,1,'') from dbo.[UMG sent 2016] as T2;
Run Code Online (Sandbox Code Playgroud)

它已经运行了5个小时。
如何加快流程?

sql-server t-sql group-concatenation

5
推荐指数
2
解决办法
3万
查看次数

使用合并检查所有变量是否为空

如何使用coalesce 检查所有具有不同类型优先级的变量是否全部为NULL 而不会遇到错误。

DECLARE 
@StartDate DATETIME = NULL,
@EndDate DATETIME = NULL,
@StateCode CHAR(2) = NULL,
@CountyCode CHAR(3) = NULL,
@ProducerName VARCHAR(64) = null,
@TaxID VARCHAR(9) = null,
@Farm INT = null

SELECT CASE WHEN COALESCE(
    @StartDate, 
    @EndDate, 
    @StateCode, 
    @CountyCode, 
    @ProducerName, 
    @TaxID, 
    @Farm) IS NULL 
THEN 'yes' ELSE 'no' END
Run Code Online (Sandbox Code Playgroud)

输出:'是'

添加SELECT @StateCode = '22'会出现此错误

Msg 241, Level 16, State 1, Line 94
Conversion failed when converting date and/or time from character string.
Run Code Online (Sandbox Code Playgroud)

这是有效的

SELECT CASE WHEN …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

5
推荐指数
2
解决办法
1692
查看次数

CASE 语句和 SARGability - 特定用例

编辑:SQL Server - 我希望这是一个足够通用的问题,我不需要指定版本,但我使用的大多数实例都是 2012 或更高版本。

我不够好,无法模拟数据并实际测试它,所以我希望有人可以查看它并以简单的经验回答。

想象一下,您有一个州表,其中的一列包含美国州的缩写(并且已编入索引,就像一个很好的查找列)。在编写临时查询时,用户通常会点击此列进行过滤,但使用的条件表示数据库中未隐含的信息。

例如,如果他们想要获得“大状态”,他们可能会在他们的即席查询中包含一个过滤器,显示类似

...
where
  StateAbbreviation in ('AK', 'TX')
Run Code Online (Sandbox Code Playgroud)

又名可怕的“商业规则”

所以这个查询很好,它执行得很好,并且利用了索引。但是,伙计,每次我们需要查询“大国”时,写下来真是太糟糕了。我很想在它的定义中使用这个过滤器创建一个视图,以使其更容易使用。

这里的问题是,这些业务规则特定于一些支持业务线的即席查询,但实际上并没有普遍用途。因此,创建一个以这种方式过滤数据的视图将没有什么用处。

因此,我想编写一个计算条件结果的视图,而不是编写该条件在过滤器中的视图,例如

select 
  StateAbbreviation
  , IsBig = case when StateAbbreviation in ('AK' , 'TX') then 1 else 0 end
from tblStates
Run Code Online (Sandbox Code Playgroud)

现在,当他们想为大州写一个查询时,他们只需要包括

where IsBig = 1
Run Code Online (Sandbox Code Playgroud)

在查询中。

所以,我的问题很简单 - 如果使用该条件调用视图,是否可以使用 StateAbbreviation 上的索引?

我知道我可以在 CASE 语句中做各种可能会改变答案的事情,所以为了回答这个非常具体的问题,假设 case 语句看起来只会像那样。它不会使用多个字段,也不会聚合 - 只是简单的文字输入或输出计算,以更简单的方式向报告编写者公开复杂的过滤条件。

performance index sql-server t-sql execution-plan

5
推荐指数
3
解决办法
1138
查看次数