是否可以在sql-server中声明不带@符号的变量?

时间:2019-01-31 12:56:29

标签: sql-server tsql variables

在这种情况下,我无法在sql中使用@符号。但是我想声明变量。没有人知道是否有任何其他的方式来声明他们不使用@符号?

3 个答案:

答案 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。

Variables (Transact-SQL)

答案 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;