存储过程抛出错误
必须声明一个表变量
在存储过程中,我从调用此存储过程的UI中获得表名。我不想在存储过程中创建表变量。如果有人有想法,将不胜感激。谢谢。
存储过程如下:
ALTER PROCEDURE [dbo].[usp_Rates_GET_CustomOFCLData]
@returnOrigin VARCHAR(256),
@returnDest VARCHAR(256)
AS
BEGIN
SET NOCOUNT ON;
SELECT
*,
'o' as LocationType
FROM
@returnOrigin
UNION ALL
SELECT
*,
'd' as LocationType
FROM
@returnDest
END
答案 0 :(得分:3)
将表值参数传递到存储过程
首先,您必须为存储过程要使用的表变量定义用户定义的类型。
CREATE TYPE KeyTable AS TABLE ([Key] INT)
然后,您可以将该类型用作存储的proc的参数(由于仅支持READONLY
并且无法更改表,因此需要IN
)
CREATE PROC usp_PassTable
@Keys KeyTable READONLY
AS
BEGIN
SET NOCOUNT ON
SELECT * FROM @Keys
END
GO
然后可以直接从SQL使用表变量调用存储的proc。
DECLARE @Keys KeyTable
INSERT @Keys VALUES (1), (2)
EXEC usp_PassTable @Keys
注意:如果使用的是.NET,则可以从与用户定义类型匹配的DataTable类型中传递SQL参数。
查询的输出示例:
Key
-----------
1
2
答案 1 :(得分:3)
根据您的代码,我认为您正在寻找DynamicSQL而不是表值参数
ALTER PROCEDURE [dbo].[usp_Rates_GET_CustomOFCLData]
@returnOrigin SYSNAME,
@returnDest SYSNAME
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX) = N'
SELECT *,''o'' as LocationType FROM '+ @returnOrigin +
' UNION ALL
SELECT *,''d'' as LocationType FROM ' + @returnDest;
EXECUTE sp_executesql @SQL;
END
系统名称数据类型用于存储对象名称的表列,变量和存储过程参数。 sysname的确切定义与标识符规则有关。因此,它在SQL Server实例之间可能有所不同。 sysname在功能上与nvarchar(128)相同,只是默认情况下sysname为NOT NULL。在早期版本的SQL Server中,sysname定义为varchar(30)。