小编Mar*_*ith的帖子

MERGE查询和删除记录

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

AccountID, ItemID
1, 100
1, 200
2, 300
Run Code Online (Sandbox Code Playgroud)

我有一个proc接受一个表值参数,该参数更新与帐户关联的项目.我们将传递以下内容:

AccountID, ItemID
3, 100
3, 200
Run Code Online (Sandbox Code Playgroud)

proc类似于:

procedure dbo.MyProc( @Items as dbo.ItemListTVP READONLY )
AS
BEGIN
  MERGE INTO myTable as target
    USING @Items
       on (Items.AccountId = target.AccountId)
       AND (Items.ItemId = target.ItemId)
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (AccountId, ItemId)
        VALUES (Items.AccountId, Items.ItemId)

   ;

END
Run Code Online (Sandbox Code Playgroud)

根据传入的数据,我希望它能在表中添加2条新记录.

我想要的是有一个WHEN NOT MATCHED BY SOURCE子句,它将删除不匹配的指定帐户的项目.

例如,如果我通过

AccountID, ItemID
1, 100
1, 400
Run Code Online (Sandbox Code Playgroud)

然后我希望它删除1,200的记录; 但是留下所有其他人.

如果我这样做:

WHEN NOT MATCHED BY SOURCE THEN
  DELETE; …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server merge sql-server-2008-r2

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

SSRS 2008:错误消息说我的参数不存在但显然呢?

我有一个包含大约10个参数和大约10个数据集和一个数据源的报告.我打字很多,但我真的需要帮助所以我想我会尝试提供尽可能多的关于问题的信息,因为我可以从一开始.

让我们简化一切,并假装这些是所有内容的相关名称,并且报告获得基本的员工信息:

  • 参数
    • facilityID:guid或uniqueidentifier格式的文本,隐藏并传入,以便报告的最终用户只能查看自己设施的信息; 单值参数,非空白不为空,隐藏,文本
    • startDate:开始日期范围,假设我希望我的报告包含从今年1月1日开始的数据; 单值参数,非空白不为空,可见,日期时间
    • endDate:日期范围的结束,让我们说今天/现在; 单值参数,非空白不为空,可见,日期时间
    • viewOption:三个硬编码值(标签,值)("当前员工",1)和("过去员工",2)和("移动设施的员工",3); 多值参数(因此选择all是一个选项),不是空白,不是空,可见,文本
    • personID:基于数据集getListOfNames,其中标签是员工姓名,值是他们的personID(guid/uniqueidentifier); 单选,非空,不空白,文本和可见
  • 我的数据集
    • getListOfNames:这将获取在给定设施的提供日期范围内在公司的人员列表,以及他们的员工状态在viewOption参数值中的位置(因此它可以只是一个数字或最多三个).这是一个存储过程,但我已经将它设置为通过传递join(参数,"〜")然后在存储过程中将其分离来处理多值参数.这适用于其他5个报告.
    • getReportInfoOnSelectedPerson:主体查询; 在用户选择他们想要数据的员工之后,这将获取该personID和日期范围并填充主表.

问题:
SSRS说viewOption不存在.但我在左侧的Parameters文件夹中看到了它.当我在参数下输入表达式时,我看到了它.参数!viewOption.value下没有波浪形的红线.但是,当我尝试将其作为getListOfNames数据集使用的参数的值时,它会出错.如果我把它放在getReportInfoOnSelectedPerson数据集中并以完全相同的方式使用它,SSRS就可以了.跆拳道?所以...我已经检查了rdl,一切都很好(声明了实际参数,在数据集引用中使用它,所有内容).它只是这一个数据集.我有一个类似的报告,使用相同的数据集,相同的基本参数和报告是好的.我尝试将dataset参数的值设置为1或者其他,这很好但是当我尝试将其设置为Parameter!viewOption.value时它出错.....现在,上面我说我通常传递存储的proc一个Join在带有波浪号的参数上〜但是我试图保持它简单,或者让它只是通常工作(通过传递多值viewOption参数的第一个值或将该参数转换为单个选择并且只是传递.但是连接也不起作用.所有这些都适用于其他数据集,这也是一个存储过程.

这是我的错误:
报告处理期间发生了错误.(rsProcessingAborted)查询参数"@viewOption"的Value表达式包含错误:表达式引用了报表参数集合中的不存在的参数.(rsRuntimeErrorInExpression)

这显然是说我的参数不存在,但我可以看到它...到处都是.如果我将其他数据集中的一个参数值分配给viewOption参数,则它可以正常工作而不会出现错误.我检查了rdl.

我之前遇到过这个问题,通过删除参数和数据集并再次创建它们来修复它(为了安全起见,我重命名了它们).这次没办法.

我很沮丧.请帮忙....

码?

      <DataSet Name="getListOfNames">
      <Fields>
          <Field Name="personID">
              <DataField>PersonId</DataField>
              <rd:TypeName>System.Guid</rd:TypeName>
          </Field>
          <Field Name="name">
              <DataField>name</DataField>
              <rd:TypeName>System.String</rd:TypeName>
          </Field>
      </Fields>
      <Query>
          <DataSourceName>myDataSource</DataSourceName>
          <CommandType>StoredProcedure</CommandType>
          <CommandText>getListOfNames</CommandText>
          <QueryParameters>
              <QueryParameter Name="@fac">
                  <Value>=join(Parameters!fac.Value,"~")</Value>
              </QueryParameter>
              <QueryParameter Name="@bldg">
                  <Value>=join(Parameters!bldg.Value,"~")</Value>
              </QueryParameter>
              <QueryParameter Name="@unit">
                  <Value>=join(Parameters!unit.Value,"~")</Value>
              </QueryParameter>
              <QueryParameter Name="@station">
                  <Value>=join(Parameters!station.Value,"~")</Value>
              </QueryParameter>
              <QueryParameter Name="@startDate">
                  <Value>=Parameters!startDate.Value</Value>
              </QueryParameter>
              <QueryParameter Name="@endDate">
                  <Value>=Parameters!endDate.Value</Value>
              </QueryParameter>
              <QueryParameter Name="@viewOption">
                  <Value>=Join(Parameters!viewOption.Value, "~")</Value>
              </QueryParameter>
          </QueryParameters>
          <rd:UseGenericDesigner>true</rd:UseGenericDesigner>
      </Query>
  </DataSet>



<ReportParameter Name="viewOption"> …
Run Code Online (Sandbox Code Playgroud)

sql-server parameters reporting-services ssrs-2008

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

SQL Server CASE .. WHEN .. IN语句

在SQL Server 2005上,我试图查询此select语句

SELECT AlarmEventTransactionTableTable.TxnID,
       CASE AlarmEventTransactions.DeviceID
         WHEN DeviceID IN( '7', '10', '62', '58',
                           '60', '46', '48', '50',
                           '137', '139', '142', '143', '164' )
           THEN '01'
         WHEN DeviceID IN( '8', '9', '63', '59',
                           '61', '47', '49', '51',
                           '138', '140', '141', '144', '165' )
           THEN '02'
         ELSE 'NA'
       END AS clocking,
       AlarmEventTransactionTable.DateTimeOfTxn
FROM   multiMAXTxn.dbo.AlarmEventTransactionTable 
Run Code Online (Sandbox Code Playgroud)

它返回以下错误

消息156,级别15,状态1,行4关键字"IN"附近的语法不正确.

请给我一些关于我的代码可能出错的建议.

sql sql-server sql-server-2005 case-when

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

检查长度= 0是否比将其与空字符串进行比较更快?

我听说在某些编程语言中检查字符串的长度是否0比检查内容是否更快"".这对T-SQL也是如此吗?

样品:

SELECT user_id FROM users WHERE LEN(user_email) = 0
Run Code Online (Sandbox Code Playgroud)

SELECT user_id FROM users WHERE user_email = ''
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server performance

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

SQL to JSON - SQL 2016中的值数组对象数组

SQL 2016具有一项新功能,可将SQL Server上的数据转换为JSON.我很难将对象数组合成值数组,即

示例 -

CREATE TABLE #temp (item_id VARCHAR(256))

INSERT INTO #temp VALUES ('1234'),('5678'),('7890')

SELECT * FROM #temp

--convert to JSON

SELECT (SELECT item_id 
FROM #temp
FOR JSON PATH,root('ids')) 
Run Code Online (Sandbox Code Playgroud)

结果 -

{
    "ids": [{
        "item_id": "1234"
    },
    {
        "item_id": "5678"
    },
    {
        "item_id": "7890"
    }]
}
Run Code Online (Sandbox Code Playgroud)

但我希望结果如下 -

"ids": [
        "1234",
        "5678",
        "7890"
    ]
Run Code Online (Sandbox Code Playgroud)

有人可以帮帮我吗?

sql json sql-server-2016

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

RESTRICT和NO ACTION之间的区别

postgresql文档:

RESTRICT可防止删除引用的行.NO ACTION表示如果在检查约束时仍存在任何引用行,则会引发错误; 如果您未指定任何内容,则这是默认行为.(这两个选择之间的本质区别在于,NO ACTION允许将支票延迟到交易的后期,而RESTRICT则不会.​​)

让我们检查一下.创建父表和子表:

CREATE TABLE parent (
  id serial not null,
  CONSTRAINT parent_pkey PRIMARY KEY (id)
);

CREATE TABLE child (
  id serial not null,
  parent_id serial not null,
  CONSTRAINT child_pkey PRIMARY KEY (id),
  CONSTRAINT parent_fk FOREIGN KEY (parent_id)
    REFERENCES parent (id) 
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
);
Run Code Online (Sandbox Code Playgroud)

填充一些数据:

insert into parent values(1);
insert into child values(5, 1);
Run Code Online (Sandbox Code Playgroud)

并且测试确实被检查了:

BEGIN;
delete from parent where id = 1; -- violates foreign …
Run Code Online (Sandbox Code Playgroud)

sql postgresql postgresql-9.2

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

如何对连续范围进行分组

我知道一些基本的sql,但这个超出了我.我看起来高低但没有骰子.我需要查看以下数据,我可以在应用程序层代码中执行此操作.但不幸的是,对于这个特定的代码,代码必须放在数据层中.

我正在使用T-SQL.

Date      Crew       DayType
01-02-11  John Doe  SEA  
02-02-11  John Doe  SEA  
03-02-11  John Doe  SEA  
04-02-11  John Doe  HOME  
05-02-11  John Doe  HOME  
06-02-11  John Doe  SEA 
Run Code Online (Sandbox Code Playgroud)

我需要这样的观点

DateFrom  DateTo    Name      DayType
01-02-11  03-02-11  John Doe  SEA
04-02-11  05-02-11  John Doe  HOME
06-02-11  06-02-11  John Doe  SEA
Run Code Online (Sandbox Code Playgroud)

不幸的是,应用层需要基表格格式为show.这可以在查询中做到吗?

谢谢

卢克

sql t-sql sql-server sql-server-2005 gaps-and-islands

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

在 SQL Server 中是否有更好的选项来应用分页而不应用 OFFSET?

我想对包含大量数据的表应用分页。我只想知道比在 SQL Server 中使用 OFFSET 更好的选择。

这是我的简单查询:

SELECT *
FROM TableName
ORDER BY Id DESC 
OFFSET 30000000 ROWS
FETCH NEXT 20 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

sql sql-server pagination keyset-pagination

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

如何制作幻像读物?

使用"可重复读取"应该可以产生幻像读取,但是如何?我需要它作为一个教学CS学生的例子.

我认为我必须在非索引字段x上创建"SELECT ... WHERE x <= 888",上限888不存在,然后在另一个连接上插入一个值低于888的新行.

除了它不起作用.我需要一张非常大的桌子吗?或者是其他东西?

mysql sql database isolation-level

23
推荐指数
4
解决办法
8675
查看次数

在SQL中使用整数

我可以更换= 与声明LIKE一个整数

通过例如.是以下相同的事情:

select * from FOOS where FOOID like 2    
// and 
select * from FOOS where FOOID = 2
Run Code Online (Sandbox Code Playgroud)

我宁愿使用LIKE而不是=因为%当我没有FOOID过滤器时我可以使用...

SQL Server 2005.

编辑1 @Martin
在此输入图像描述

sql sql-server sql-server-2005 sql-like

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