我有一个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 类似的东西。
使用 T-SQL,我试图找到最简单的方法来反转字符串的字符而不改变数值的位置。
所以对于字符串:
abc223de11
Run Code Online (Sandbox Code Playgroud)
有
edc223ba11
Run Code Online (Sandbox Code Playgroud) 最近,我尝试通过将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) 在 SQL 中命名表时,我尽量远离 SQL 保留关键字,但今天有同事质疑Events作为表名的使用。他们说,任何在 SSMS 中变成绿色的东西都不应该用作表名。
Events在 MS SQL Server 中用作表名时,是否有任何我应该关注的冲突或问题?
我正在尝试创建一个包含动态 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) 考虑:
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 行转换失败。
在这种情况下需要做什么?
这是我的第一篇文章,所以请温柔:)
我有几个疑问:
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) 我有一个存储过程,它返回多个记录集以在应用程序中使用。有时,其中一些记录集是空的。
我想减少开销,只返回那些有 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)
在实际过程中,有些查询的开销很大,所以我不想测试查询,然后如果它返回一行或更多,再次执行它......因为它太昂贵了。
我试图将数据库(.mdf和.ldf文件)移动到托管 SQL 服务器的同一台服务器上的不同目录。我按照此问答中的以下步骤操作:
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE MyDB SET OFFLINE
ALTER DATABASE MyDB MODIFY FILE (Name = MyDB, Filename = 'N:\DATA\MyDB.MDF')
ALTER DATABASE MyDB SET ONLINE
ALTER DATABASE MyDB SET MULTI_USER
当我到达 Step4 时,我收到“拒绝访问”。不幸的是,我的维护窗口很短,没有时间进行故障排除。所以我决定删除数据库并使用WITH MOVE子句恢复它以将 DB 文件放在正确的目录中。没有任何问题。
我的问题是为什么我收到“拒绝访问”?我没有更改 MSSQL 服务帐户。这是运行RESTORE.
我有几个表,我想以与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_2和e存在于table_2但不存在table_1。
表不保存任何公共数据。也就是说,JOIN任何字段上的 a 都会带来零结果。
我希望能够执行以下操作(或等效的操作。我知道我所展示的内容不可行):
CREATE VIEW MyUnion FROM(
SELECT …Run Code Online (Sandbox Code Playgroud)