标签: t-sql

将自引用条目插入 SQL Server

我有一个Person表,其中有一created_by列引用了表本身的主 ID。因此,可能是一名员工将另一名员工添加到数据库中。它工作正常。

People也可以自己添加(注册)。所以created_by列中的值应该是该列的自动递增值id。但该值显然在插入之后才可用。

所以我可以(a)使引用不检查值,(b)在开头添加一个默认值或(c)使列可以为空。所有的选择对我来说都不好。

MySQL的方言是这样的:

SET FOREIGN_KEY_CHECKS = 0;
INSERT INTO EMPLOYEE VALUES('12345','67890'),('67890','12345');
SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)

...但我找不到 SQL Server 的 T-SQL 类似的东西。

database-design sql-server t-sql

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

反转字符串的字符而不改变 T-SQL 中数值的位置

使用 T-SQL,我试图找到最简单的方法来反转字符串的字符而不改变数值的位置。

所以对于字符串:

abc223de11 
Run Code Online (Sandbox Code Playgroud)

edc223ba11
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql string

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

T-SQL LIKE 谓词无法与 XML 转换的 varchar 中的空格匹配

最近,我尝试通过将XML数据转换为特定模式来搜索特定模式,varchar(max)尽管我知道这不是最佳实践,并且发现它没有按预期工作:-

设置

declare @container table(
    [Response] xml not null
);

declare @xml xml =
'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://abc.com/xsd" xmlns:ns="http://abc.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header>
     <ns:MessageHeader>
       <xsd:ID>ABC</xsd:ID>
       <xsd:Date>2018-12-31T23:59:59</xsd:Date>
     </ns:MessageHeader>
   </soapenv:Header>
   <soapenv:Body>
     <ns:MessageResponse>
       <ns:return>
         <xsd:ResponseList xsi:nil="true" />
       </ns:return>
     </ns:MessageResponse>
   </soapenv:Body>
 </soapenv:Envelope>';

insert into @container values (@xml);
Run Code Online (Sandbox Code Playgroud)

此查询有效

select *
  from @container
 where cast(Response as varchar(max))
  like '%<xsd:ResponseList xsi:nil="true"%';
Run Code Online (Sandbox Code Playgroud)

注意通配符在 XML 节点之前的3 个字符(即结束' />'

但这不是

select *
  from @container
 where cast(Response as varchar(max))
  like '%<xsd:ResponseList xsi:nil="true" %' -- …
Run Code Online (Sandbox Code Playgroud)

xml sql-server t-sql like string-searching

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

与目录视图同名的 SQL 表

在 SQL 中命名表时,我尽量远离 SQL 保留关键字,但今天有同事质疑Events作为表名的使用。他们说,任何在 SSMS 中变成绿色的东西都不应该用作表名。

Events在 MS SQL Server 中用作表名时,是否有任何我应该关注的冲突或问题?

sql-server best-practices ssms naming-convention t-sql

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

存储过程错误“必须声明标量变量”

我正在尝试创建一个包含动态 SQL 的存储过程。proc 接收 5 个变量,其中 3 个是列和字段的名称,另外 2 个用于 OFFSET 和 FETCH NEXT 部分。我在最后两个变量上不断收到此错误:

消息 137,级别 15,状态 2,第 34 行 必须声明标量变量“@numOfOffset”。消息 137,级别 15,状态 2,第 34 行 必须声明标量变量“@numOfRows”。

我会感谢一些帮助,请

IF (SELECT 1 FROM sys.procedures WHERE [name] = 'sp_targil1') = 1
    DROP PROCEDURE sp_targil1;
GO

CREATE PROCEDURE sp_targil1 (@tableName varchar(30), @fieldNameAggBy varchar(30), @fieldNameToAggOn varchar(30)
    ,  @numOfOffset int, @numOfRows int
    )
AS
BEGIN
    DECLARE @query1 varchar(500)
    DECLARE @qaeryMain varchar(500)
    DECLARE @maxNumberOfRows int

    SET @qaeryMain = 
    '
    SELECT ' + @fieldNameAggBy + ', …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures dynamic-sql t-sql

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

动态 SQL 查询 - 如何将 int 添加到代码中?

考虑:

Declare @stringsvar varchar(1000)
Declare @Emp_id int 
DECLARE  @strvar SYSNAME = 'Employee_test'

SET @stringsvar = ('select * from' + ' ' + @strvar + ' where emp_id' + ' =' + @Emp_id)
Print @stringsvar
Run Code Online (Sandbox Code Playgroud)

上面的查询给出了如下所述的错误:

将 nvarchar 值 'select * from Employee_test where emp_id =' 转换为数据类型 int 时,消息 245,级别 16,状态 1,第 17 行转换失败。

在这种情况下需要做什么?

sql-server sql-injection dynamic-sql t-sql

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

具有 Distinct 的 SUM 大小写逻辑

这是我的第一篇文章,所以请温柔:)

我有几个疑问:

SELECT COUNT(DISTINCT(h.USERID))
FROM MHGROUP.USERHISTORY h with (NOLOCK) 
JOIN MHGROUP.DOCUSERS u with (NOLOCK) on h.USERID = u.USERID
where h.CUSTOM2 = 'Work Web'
and h.ACTIONDATETIME >= GETUTCDATE()-30 
and u.LOGIN = 'y'
Run Code Online (Sandbox Code Playgroud)
SELECT COUNT(DISTINCT(h.USERID))
FROM MHGROUP.USERHISTORY h with (NOLOCK) 
JOIN MHGROUP.DOCUSERS u with (NOLOCK) on h.USERID = u.USERID
where h.CUSTOM2 = 'Work Web'
and h.ACTIONDATETIME >= GETUTCDATE()-30 
and u.LOGIN = 'y'
Run Code Online (Sandbox Code Playgroud)

现在我被要求提取去年的数据,所以我想我会使用 case 语句,但无法弄清楚如何将不同的用户部分合并到 sum case 语句中......所以我得到了巨大的数字, 明显地

SELECT COUNT(DISTINCT(h.USERID))
FROM MHGROUP.USERHISTORY h with (NOLOCK) 
JOIN MHGROUP.DOCUSERS u with (NOLOCK) on …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

如果有行,则仅从存储过程返回记录集

我有一个存储过程,它返回多个记录集以在应用程序中使用。有时,其中一些记录集是空的。

我想减少开销,只返回那些有 1 行或更多行的。

我的问题是 - 我怎样才能只返回那些有行的记录集?

应用程序只需要 0 个或更多记录集,并循环遍历每个记录集,然后将它们打印出来。

我知道我可以在应用程序代码中跳过它们,但我试图阻止它们被返回(如果为空)。

程序很简单:

CREATE PROCEDURE bfsp_PROC_NM
AS 

    BEGIN

        SELECT * FROM TABLE_1

        SELECT * FROM TABLE_2

        SELECT * FROM TABLE_3

        RETURN  

    END
GO
Run Code Online (Sandbox Code Playgroud)

在实际过程中,有些查询的开销很大,所以我不想测试查询,然后如果它返回一行或更多,再次执行它......因为它太昂贵了。

sql-server stored-procedures t-sql sql-server-2014

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

将 SQL Server 数据库文件移动到新位置 - 为什么权限错误?

我试图将数据库(.mdf.ldf文件)移动到托管 SQL 服务器的同一台服务器上的不同目录。我按照此问答中的以下步骤操作:

  1. ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

  2. ALTER DATABASE MyDB SET OFFLINE

  3. ALTER DATABASE MyDB MODIFY FILE (Name = MyDB, Filename = 'N:\DATA\MyDB.MDF')

  4. ALTER DATABASE MyDB SET ONLINE

  5. ALTER DATABASE MyDB SET MULTI_USER

当我到达 Step4 时,我收到“拒绝访问”。不幸的是,我的维护窗口很短,没有时间进行故障排除。所以我决定删除数据库并使用WITH MOVE子句恢复它以将 DB 文件放在正确的目录中。没有任何问题。

我的问题是为什么我收到“拒绝访问”?我没有更改 MSSQL 服务帐户。这是运行RESTORE.

sql-server t-sql

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

T-SQL 等价于 Python Pandas Concatenate

我有几个表,我想以与Python Pandas Concatenate类似的方式合并。我不想复制信息,因为它相当大。我想有一个VIEW喜欢的行为。让我用一个假的例子来说明,据我所知是行不通的,只是为了正确解释我想要实现的目标。

假设我有这两个表:

CREATE TABLE table_1 (
    [a] [bigint] NOT NULL,
    [b] [bigint] NOT NULL,
    [c] [varchar] (32) NULL,
    [d] [bigint] NULL,
)
GO

CREATE TABLE table_2 (
    [a] [bigint] NOT NULL,
    [b] [bigint] NOT NULL,
    [c] [varchar] (32) NULL,
    [e] [varchar](256) NULL,
)
GO
Run Code Online (Sandbox Code Playgroud)

哪里a, b, c是等价的,但保存不同的数据。 d存在于table_1但不存在table_2e存在于table_2但不存在table_1

表不保存任何公共数据。也就是说,JOIN任何字段上的 a 都会带来零结果。

我希望能够执行以下操作(或等效的操作。我知道我所展示的内容不可行):

CREATE VIEW MyUnion FROM(
SELECT …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql view union

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