在这种情况下,我无法在sql中使用@符号。但是我想声明变量。没有人知道是否有任何其他的方式来声明他们不使用@符号?
答案 0 :(得分:5)
一种解决方法是使用临时表。这样会增加很多开销,影响查询计划,并且需要更多代码才能实现相同的功能,但是您可以使其正常工作。
请注意,它们不是变量,没有@
,就不能使用变量。
说你不能这样做:
DECLARE @FilterDate DATE = '2019-01-01'
DECLARE @FilterInt INT = 20
SELECT
T.*
FROM
SomeTable AS T
WHERE
T.Date > @FilterDate AND
T.Integer > @FilterInt
临时表的解决方法:
IF OBJECT_ID('tempdb..#Variables') IS NOT NULL
DROP TABLE #Variables
CREATE TABLE #Variables (
VariableName VARCHAR(100) PRIMARY KEY,
Value VARCHAR(100))
INSERT INTO #Variables (
VariableName,
Value)
VALUES
('FilterDate', '2019-01-01'),
('FilterInt', '20')
SELECT
T.*
FROM
SomeTable AS T
WHERE
T.Date > (SELECT CONVERT(DATE, V.Value) FROM #Variables AS V WHERE V.VariableName = 'FilterDate') AND
T.Integer > (SELECT CONVERT(INT, V.Value) FROM #Variables AS V WHERE V.VariableName = 'FilterInt')
尽管有一个奇怪的要求,即不使用@
,但您可能也不能使用#
...
答案 1 :(得分:1)
您在这里很不幸:
DECLARE语句通过以下方式初始化Transact-SQL变量:
分配名称。 名称必须以单个@开头 字符。
分配系统提供的或用户定义的数据类型和长度。 对于数字变量,还会分配精度和小数位。对于 XML类型的变量,可以分配一个可选的模式集合。
将值设置为NULL。
答案 2 :(得分:0)
您可以使用临时表。它的性能不佳,但是如果这对您来说不是问题,则可以使用@符号解决您的问题。看这个例子:
IF OBJECT_ID('tempdb..#var') IS NOT NULL
DROP TABLE #var;
CREATE TABLE #var (var1 int);
INSERT INTO #var (var1) VALUES (12);
SELECT var1 FROM #var;
UPDATE #var SET var1 = 34;
SELECT var1 FROM #var;