标签: t-sql

在动态查询之外声明的变量的动态查询值中设置

我有一个存储过程,我以这种方式进行了简化:

DECLARE @variable1 INT

DECLARE @SQL VARCHAR(MAX)

SET @SQL = '
    DECLARE @variable2 INT

    SET @variable2 = 1
    SET '+CAST(@variable1 AS VARCHAR)+' = @variable2

    SELECT @variable1 as V1, @variable2 as V2
'
EXEC(@SQL)
Run Code Online (Sandbox Code Playgroud)

但是这个脚本没有给我任何东西!我很确定这与范围有关。问题是我需要在动态查询之外声明变量。

感谢帮助 !

编辑 :

WHILE LOOP UNTIL SELECT COUNT xxx = 0
BEGIN
    DECLARE @variable1 INT

    DECLARE @SQL VARCHAR(MAX)

    SET @SQL = '
                EXEC STORE PROC WITH PARAMETER @Param1 = @variable1 (first loop @Param1 is null)

                STORE PROC RETURN A VALUE

                SET @variable1 with return value …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

在选择中使用 COLUMN AS (left([Another_Column],(4)) 而不是 LEFT 是个好主意吗?

我遇到了一张这样的表:

CREATE TABLE TABLE1
(
 CD1    int
,CD2    varchar(16)
,CD3    varchar(21)
,CD4    decimal(14,0)
,CD5    varchar(4)
,CD6    decimal(18,2)
,CD7    AS (left([CD3],(4)))
)
Run Code Online (Sandbox Code Playgroud)

该表有超过 40 亿行(完全没有必要,但这是另一个主题)。

正如您在最后一列中看到的,它们使用AS (left([CD3],(4))). 我认为这是非常无用的,因为我们几乎从来没有在这个表上有一个 SELECT,这里只是使用空间。

在需要时在选择期间选择该字段不是更好吗?

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

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

具有相同 object_id 但名称不同的索引

当我跑

SELECT
  count(object_id) AS count,
  object_id,
  min(name) as name1,
  max(name) AS name2
FROM
  sys.indexes
GROUP BY object_id HAVING COUNT(*) > 1 ORDER BY count
Run Code Online (Sandbox Code Playgroud)

我将获得具有相同object_id但不一定具有相同名称的索引列表。

不应该所有object_id具有相同名称的索引都具有相同的名称吗?

index sql-server t-sql

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

查询在特定城市的所有分行都有存款的客户

我有 3 个表如下:

Customer (CustomerName , CustomerCity , CustomerStreet)
Branch   (BranchName , BranchCity)
Deposit  (CustomerName , BranchName , AccountNumber , Balance)
Run Code Online (Sandbox Code Playgroud)

在这里,我向您展示上表的示例数据:

Customer ('John','City1','Street1')
         ('Lili','City2','street2')

Branch   ('Branch1','Kaj')
         ('Branch2','Bahar')
         ('Branch3','Bahar')
         ('Branch4','Bahar')

Deposit  ('John','Branch1',12,1000)
         ('Lili','Branch1',123,1222)
         ('Lili','Branch2',124,45233)
         ('Lili','Branch3',345,6000)
         ('Lili','Branch4',567,5600)
Run Code Online (Sandbox Code Playgroud)

所以根据上面的信息,我需要一个查询来给我在 Bahar 的所有分行都有存款的 CustomerName 。

我应该在输出中看到“Lili”,因为它在 Bahar 的所有分支都有存款,但我不应该看到 John,因为它只在 Bahar 的一个分支中有存款。

我尽力编写查询,但我不能。你能帮我解决这个问题吗?

sql-server query t-sql

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

删除前导和尾随引号

我有一个可能以引号开头和结尾的字段。如果字符串以引号开头和结尾,我只想删除引号。如果字符串中存在引号,那么我希望保留它们。

REVERSE如果该字段确实以引号开头和结尾,我已经使用了一些有用的东西,但如果不是,则它只返回空值。

如果字段结果不是以引号开头,我如何确保我仍然获得字段结果?

我拥有的:

REVERSE(STUFF(REVERSE(STUFF(fieldname, CHARINDEX('"', fieldname), LEN('"'), '')), CHARINDEX('"', REVERSE(STUFF(fieldname, CHARINDEX('"', fieldname), LEN('"'), '')), 1), 1, ''))
Run Code Online (Sandbox Code Playgroud)

sql-server query t-sql sql-server-2016 string-manipulation

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

如何在存储过程中使用 SP_EXECUTESQL 从查询中返回值

我有一个存储过程,它生成一个查询字符串,然后执行它

EXECUTE SP_EXECUTESQL @Query
Run Code Online (Sandbox Code Playgroud)

例如,查询是:Select Name, Age from tableA,非常简单。

但是如何从SP_EXECUTESQL(到变量中?)获取结果集,然后在我的存储过程中将其作为结果集返回?

sql-server stored-procedures t-sql

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

在 SELECT 中分配变量是否执行 RBAR 操作?

所以,我发现了一些有趣的事情。我在玩 TOP 命令并在 select 语句中分配变量。我发出了以下查询,发现变量 (@a) 值是从 Top 命令返回的最后一个值。似乎对于每个返回的值,该值被分配给变量,然后结果集中的每一行随后被分配,几乎就像一个循环。

declare @a nvarchar(max)

select top 10 DisplayName
from dbo.Users

select top 10 @a = DisplayName
from dbo.Users

select @a as Results
Run Code Online (Sandbox Code Playgroud)

结果:

结果集 1

这让我很好奇。我修改了查询以再次测试并执行以下操作:

declare @a nvarchar(max)
declare @b int = 0

select TOP 10 @a = DisplayName, @b = @b + 1
from dbo.Users

select @a as DisplayName, @b as Number
Run Code Online (Sandbox Code Playgroud)

结果:

结果图 2

这真的很有趣。从这两个查询来看,由于@b 上发生的累积总和以及上面发生的分配,TOP 命令似乎正在执行某种循环。有人可以解释发生了什么吗?使用 TOP 命令时,SQL 是否会执行 RBAR 操作?

编辑:

我也在没有 TOP 命令的情况下执行此操作,并查看结果,因此它不仅仅是 TOP 命令。似乎在 SELECT 语句中分配变量执行 RBAR 命令?

declare …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

SQL Server - 选择使用拆分的位置 - 不声明函数

SQL 服务器。兼容性级别 120。

我有一个表,其中一个 VARCHAR 列包含以分号分隔的整数值。我想对该列中的值进行 SELECT,就好像它们存在于某处的整数列中一样。

由于兼容级别,我不能使用 STRING_SPLIT。我也无法创建任何全局可用的函数。

但是,如果需要,我可以创建一个临时表。我的行动方针是什么?某种 WHILE 循环的嵌套(一个用于表的行,另一个用于字符串中的分号)?

更新:这可能是我想要实现的更好的解释:

假设我有以下表格。

CREATE TABLE Service
(
      ServiceId int
      , CustomerIds varchar(255)
);
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE Customer
(
    CustomerId int
    , CustomerName varchar(30)
);
Run Code Online (Sandbox Code Playgroud)

有一些数据

INSERT INTO Customer (CustomerId, CustomerName)
VALUES  (1, 'John')
    ,(2, 'Niels')
    ,(3, 'Frank')
    ,(4, 'Barbie')
    ,(5, 'Holly')
    ,(6, 'Ebeneezer');
Run Code Online (Sandbox Code Playgroud)
INSERT INTO Service (ServiceId, CustomerIds)
VALUES  (1, '4')
    ,(2, '2;3');
Run Code Online (Sandbox Code Playgroud)

假设我想为任何客户选择 Customer.CustomerName,该客户的 ID 显示在该表中任何行的 CustomerIds 中。

也就是说,我想检索Niels,FrankBarbie

sql-server t-sql string-splitting

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

如何强制系统管理员将数据存储在 dbo 以外的模式中?

我正在使用 GUI 工具在我的 SQL Server 2016 数据库中上传数据。用于上述任务的用户已被授予 sysadmin 权限,我创建了一个专用架构来存储上述数据。这个架构是拥有的,默认为上述用户。问题是,当我上传数据时,它存储在 dbo 模式而不是专用模式中,我无法从该用户那里撤销 sysadmin priv。

请让我知道如何在不撤销 sysadmin priv 的情况下将数据上传到这个专用模式?

谢谢

schema security sql-server role t-sql

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

fn_LocalTimeToUTC 的基本替代方案

我的云提供商阻止我访问fn_LocalTimeToUTCfn_UTCToLocalTime.

我将如何在不使用这些函数的情况下在 SQL 中手动和直接获得这两个函数提供的相同功能?

为了进一步简化,我们所有的用户都在英国。

sql-server t-sql functions sql-server-2017

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