是否可以在表变量列的定义中整理SQL_Latin1_General_CP1_CS_AS?
我想这样做的原因是因为我在我的源表的情况下敏感信息,但是当我在表变量插入它有一个与主键(这是群集)的问题 - 检测重复值 - 像"所有"和所有'.
这就是为什么我试图找到一种方法使表变量列区分大小写,如下面的语句:
SELECT SERVERPROPERTY ('Collation')
Run Code Online (Sandbox Code Playgroud)
给我:"SQL_Latin1_General_CP1_CI_AS"
我显然误解了批处理和会话之间的区别。我相信三件事不能同时为真:
GO 标志着一批的结束。@t应该超出范围declare @t table (id int)
insert into @t values (1)
select * from @t
GO
select * from @t
Run Code Online (Sandbox Code Playgroud)
显然我弄错了一些事情,但是什么?
我现在正在看sprocs似乎遵循下面演示的行为
DECLARE @tablevar TABLE
(
FIELD1 int,
FIELD2 int,
FIELD3 varchar(50),
-- etc
)
INSERT INTO @tablevar
(
FIELD1,
FIELD2,
FIELD3,
-- etc
)
SELECT FIELD1, FIELD2, FIELD3, -- etc
FROM
TableA Inner Join TableB on TableA.Foo = TableB.Foo
Inner Join TableC on TableB.Bar = TableC.Bar
-- Where, Order By, etc.
Select FIELD1, FIELD2, FIELD3, -- etc
FROM @tablevar
Run Code Online (Sandbox Code Playgroud)
使用这种方法有什么好处,而不是使用普通的select语句并跳过表变量?
我已经声明了一个表变量'@t',并正确执行了'INSERT-INTO-SELECT'.当我试图通过对每组行编号进行一些额外计算来查询表变量时,我在使用'@t'直接使用"必须声明变量"或使用'@t'的别名时出现"无效对象名称"错误".请提出建议.
SELECT
*,
(SELECT COUNT(*) FROM "LTV" "COUNTER"
WHERE
"COUNTER"."Collateral_ID" = "LTV"."Collateral_ID"
AND
"COUNTER"."m_il_no" = "LTV"."m_il_no"
AND
"COUNTER"."Ref_Key" <= "LTV"."Ref_Key"
GROUP BY "COUNTER"."Collateral_ID", "COUNTER"."m_il_no"
) "MIL_IDX"
FROM @t AS LTV
Run Code Online (Sandbox Code Playgroud) 我在我的SP中使用了这个表变量:
DECLARE @t TABLE(ID uniqueidentifier)
Run Code Online (Sandbox Code Playgroud)
然后我插入一些数据(我稍后使用):
INSERT INTO @t(ID)
SELECT ID FROM Categories WHERE ...
Run Code Online (Sandbox Code Playgroud)
而后来我有几个SELECT和UPDATE基于@tID的,例如:
SELECT * FROM Categories A INNER JOIN @t T ON A.ID = T.ID
etc..
Run Code Online (Sandbox Code Playgroud)
我应该声明ID uniqueidentifier PRIMARY KEY增加SELECT/ UPDATEstatements中的持久性吗?如果是,它应该是群集还是非群集?我的建议选项是什么?
编辑:数据库中的所有表都有uniqueidentifier(ID)列作为主键NONCLUSTERED
EDIT2:奇怪(或没有)当我尝试使用PRIMARY KEY NONCLUSTERED表变量时,当使用连接的SELECT时,我在执行计划中看到有一个Table Scanon @t.但是当我省略时NONCLUSTERED有一个Clustered Index Scan.
我的功能看起来像这样:
CREATE FUNCTION fn_FileSys_DirExists(@dirName AS nvarchar(260))
RETURNS bit
AS
BEGIN
DECLARE @dirExists int
DECLARE @fileResults TABLE
(
file_exists int,
file_is_a_directory int,
parent_directory_exists int
)
INSERT @fileResults (file_exists, file_is_a_directory, parent_directory_exists)
EXEC master.dbo.xp_fileexist @dirName
SELECT @dirExists = file_is_a_directory FROM @fileResults
RETURN @dirExists
END
Run Code Online (Sandbox Code Playgroud)
当我尝试执行上面的SQL时,我收到以下错误:
在函数中无效使用副作用运算符'INSERT EXEC'.
我认为函数中的表变量的操作不被视为副作用操作?
t-sql sql-server sql-function table-variable sql-server-2012
我在存储过程中有一个 UPDATE 查询,其中我需要更新一个已经由一些数据填充的表变量。这个查询,如下面的代码,由于在子查询中引用了表变量,即在子查询中@daysPerEmail.ProductId被引用而给出错误。我尝试为表变量使用别名,如 in UPDATE @daysPerEmail d SET LastEmailDate...,但它没有帮助。
问题:如何重写查询以便在子查询中正确引用 ProductId 的表变量列?
UPDATE @daysPerEmail SET LastEmailDate = (SELECT max(ActionDate) FROM
useractionsreport WHERE ProductId = @daysPerEmail.ProductId
and ActionTypeId = @userActionTypeId );
Run Code Online (Sandbox Code Playgroud)
更新 1
为了在 SSMS 中重现这一点,我使用以下查询。SSMS 给出一个错误说Must declare the scalar variable "@daysPerEmail".
DECLARE @daysPerEmail TABLE (
VendorId INT,
DaysPerEmail SMALLINT,
LastEmailDate DATE,
ProductId INT
)
INSERT INTO @daysPerEmail (VendorId, DaysPerEmail, LastEmailDate, ProductId)
VALUES (10, 5, NULL, 11), (12, 3, NULL, 15), (14, 1, NULL, 22);
UPDATE …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 SQL Server 中创建一个表变量,查询它,并将结果返回到一个 Pandas 数据框(参见示例)。我想这样做,以便我可以在将数据发送到 Pandas 数据帧之前聚合数据库中的数据。我记得设置NOCOUNT ON将允许它工作,因为它在执行每个查询时不会返回任何内容。但这不起作用。所以这显然是一个示例代码,但我已经能够在这里重新创建错误。按照建议的链接为您提供ProgrammingErrors. 我没有发现它很有帮助。
import urllib
import sqlalchemy
import pandas as pd
quoted = urllib.parse.quote_plus('DRIVER={ODBC Driver 17 for SQL Server};Server=127.0.0.1;Database=mydb;UID=myuser;PWD=mypasswd;Port=1433;')
engine = sqlalchemy.create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted))
query = """
SET NOCOUNT ON;
DECLARE @n_majors TABLE (id varchar(9), n_majors int)
INSERT INTO @n_majors
SELECT m.student_id_fk
, COUNT(DISTINCT dc.category) AS [N majors declared]
FROM msu_db.dbo.Majors AS m
JOIN department_categories AS dc
ON dc.dept_name = m.dept_name
WHERE m.Student_Level_Code = 'UN'
GROUP BY m.student_id_fk
DECLARE @grad_category …Run Code Online (Sandbox Code Playgroud) 我试图将外部应用放在表变量上,但我收到如下错误
无法在表上调用方法.
我有Split功能,将字符串拆分为一定长度
CREATE FUNCTION Split(@String varchar(MAX), @SplitLength int)
RETURNS @Result TABLE (Splited varchar(MAX))
AS
BEGIN
Declare @Cnt int
Set @Cnt = FLOOR((len(@String)/@SplitLength));
While @Cnt!=0
Begin
SET @Cnt=@Cnt-1;
While len(@String)>@SplitLength
Begin
INSERT INTO @Result VALUES (SUBSTRING(@String,1,@SplitLength))
SET @String=SUBSTRING(@String,@SplitLength+1,len(@String)-@SplitLength)
End
End
RETURN
END
Run Code Online (Sandbox Code Playgroud)
我与表变量连接,其中包含要分割字符串的列
DECLARE @LeftSuper TABLE
(
KeyTerm VARCHAR(MAX),
Data VARCHAR(MAX) ,
)
Run Code Online (Sandbox Code Playgroud)
查询如下,哪个生成错误(无法调用表上的方法)
select KeyTerm ,D.Splited from @LeftSuper
outer apply [Split](@LeftSuper.Data,300) as D
Run Code Online (Sandbox Code Playgroud)
注意:代码适用于db中的Real Table.
是否可以将变量设置为具有多个值?
在下面的示例中,我想设置@variable和使用商店号码1,4,7和12
然后在WHERE声明中使用变量.
以下是纯粹的例子,看看这是否可行
Declare @Variable INT;
Set @Variable = IN(1,4,7,12)
Select *
From dbo.EUactivestores eu
Where eu.[Store No] = @Variable
Run Code Online (Sandbox Code Playgroud)
如果这是可能的,或类似的东西的任何建议将是伟大的.
我相信它可以帮助我创建一个更动态的查询
sql-server ×10
table-variable ×10
t-sql ×5
sql ×2
collate ×1
declare ×1
pandas ×1
primary-key ×1
python ×1
sql-function ×1
sql-update ×1
variables ×1