我有一个存储过程,我以这种方式进行了简化:
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) 我遇到了一张这样的表:
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,这里只是使用空间。
在需要时在选择期间选择该字段不是更好吗?
当我跑
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具有相同名称的索引都具有相同的名称吗?
我有 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 的一个分支中有存款。
我尽力编写查询,但我不能。你能帮我解决这个问题吗?
我有一个可能以引号开头和结尾的字段。如果字符串以引号开头和结尾,我只想删除引号。如果字符串中存在引号,那么我希望保留它们。
REVERSE如果该字段确实以引号开头和结尾,我已经使用了一些有用的东西,但如果不是,则它只返回空值。
如果字段结果不是以引号开头,我如何确保我仍然获得字段结果?
我拥有的:
REVERSE(STUFF(REVERSE(STUFF(fieldname, CHARINDEX('"', fieldname), LEN('"'), '')), CHARINDEX('"', REVERSE(STUFF(fieldname, CHARINDEX('"', fieldname), LEN('"'), '')), 1), 1, ''))
Run Code Online (Sandbox Code Playgroud) 我有一个存储过程,它生成一个查询字符串,然后执行它
EXECUTE SP_EXECUTESQL @Query
Run Code Online (Sandbox Code Playgroud)
例如,查询是:Select Name, Age from tableA,非常简单。
但是如何从SP_EXECUTESQL(到变量中?)获取结果集,然后在我的存储过程中将其作为结果集返回?
所以,我发现了一些有趣的事情。我在玩 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)
结果:
这让我很好奇。我修改了查询以再次测试并执行以下操作:
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)
结果:
这真的很有趣。从这两个查询来看,由于@b 上发生的累积总和以及上面发生的分配,TOP 命令似乎正在执行某种循环。有人可以解释发生了什么吗?使用 TOP 命令时,SQL 是否会执行 RBAR 操作?
编辑:
我也在没有 TOP 命令的情况下执行此操作,并查看结果,因此它不仅仅是 TOP 命令。似乎在 SELECT 语句中分配变量执行 RBAR 命令?
declare …Run Code Online (Sandbox Code Playgroud) 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,Frank和Barbie。
我正在使用 GUI 工具在我的 SQL Server 2016 数据库中上传数据。用于上述任务的用户已被授予 sysadmin 权限,我创建了一个专用架构来存储上述数据。这个架构是拥有的,默认为上述用户。问题是,当我上传数据时,它存储在 dbo 模式而不是专用模式中,我无法从该用户那里撤销 sysadmin priv。
请让我知道如何在不撤销 sysadmin priv 的情况下将数据上传到这个专用模式?
谢谢
我的云提供商阻止我访问fn_LocalTimeToUTC和fn_UTCToLocalTime.
我将如何在不使用这些函数的情况下在 SQL 中手动和直接获得这两个函数提供的相同功能?
为了进一步简化,我们所有的用户都在英国。