将列名动态传递给 SQL 查询
Dynamically pass column name to SQL query
我想知道是否可以传递 table 的列名,以便为我的存储过程创建动态查询。我将不胜感激任何帮助!
好的查询:
SELECT
A1,
LEFT (A1,CHARINDEX(',',A1)-1) AS UPC,
SUBSTRING(A1,CHARINDEX(',', A1 , 1) + 1,LEN(A1) - CHARINDEX(',', A1) - CHARINDEX(',', REVERSE(A1))) AS Date,
SUBSTRING(A1,CHARINDEX(',', A1 , 1) + 7,LEN(A1) - CHARINDEX(',', A1) - CHARINDEX(',', REVERSE(A1))) AS Qty
FROM Registry Where Id=26
输出:
A1 UPC Date Qty
-------------------------------------
CPU1,01/15,3 CPU1 01/15 3
这是我目前的存储过程
SP:
ALTER PROCEDURE [dbo].[SP_UPD_Compartment]
@Id int,
@Col_Name char(40)
AS
BEGIN
SET NOCOUNT ON;
SELECT
@Col_Name,
LEFT (@Col_Name,CHARINDEX(',',@Col_Name)-1) AS UPC,
SUBSTRING(@Col_Name,CHARINDEX(',', @Col_Name , 1) + 1,LEN(@Col_Name) - CHARINDEX(',', @Col_Name) - CHARINDEX(',', REVERSE(@Col_Name))) AS Date,
SUBSTRING(@Col_Name,CHARINDEX(',', @Col_Name , 1) + 7,LEN(@Col_Name) - CHARINDEX(',', @Col_Name) - CHARINDEX(',', REVERSE(@Col_Name))) AS Qty
FROM Registry Where Id=@Id
END
错误信息:
Msg 537, Level 16, State 2, Procedure SP_UPD_Compartment, Line 9
Invalid length parameter passed to the LEFT or SUBSTRING function.
我是从选项卡输入的,所以可能会有一些语法错误,但我想你会明白的。首先,您使用语句创建一个字符串,然后将子字符串“@Col_Name”替换为传递给过程的参数。然后你执行那个动态 sql。您还可以在 EXEC(@cmd)
之前添加 Print @cmd
以查看实际将执行的内容。
ALTER PROCEDURE [dbo].[SP_UPD_Compartment]
@Id INT,
@Col_Name CHAR(40)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @cmd NVARCHAR(4000) =
'SELECT
@Col_Name,
LEFT (@Col_Name,CHARINDEX('','',@Col_Name)-1) AS UPC,
SUBSTRING(@Col_Name,CHARINDEX('','', @Col_Name , 1) + 1,LEN(@Col_Name) - CHARINDEX('','', @Col_Name) - CHARINDEX('','', REVERSE(@Col_Name))) AS Date,
SUBSTRING(@Col_Name,CHARINDEX('','', @Col_Name , 1) + 7,LEN(@Col_Name) - CHARINDEX('','', @Col_Name) - CHARINDEX('','', REVERSE(@Col_Name))) AS Qty
FROM Registry WHERE Id=' + CAST(@Id AS NVARCHAR(20))
SET @cmd = REPLACE(@cmd, '@Col_Name', @Col_Name)
EXEC(@cmd)
END
我想知道是否可以传递 table 的列名,以便为我的存储过程创建动态查询。我将不胜感激任何帮助!
好的查询:
SELECT
A1,
LEFT (A1,CHARINDEX(',',A1)-1) AS UPC,
SUBSTRING(A1,CHARINDEX(',', A1 , 1) + 1,LEN(A1) - CHARINDEX(',', A1) - CHARINDEX(',', REVERSE(A1))) AS Date,
SUBSTRING(A1,CHARINDEX(',', A1 , 1) + 7,LEN(A1) - CHARINDEX(',', A1) - CHARINDEX(',', REVERSE(A1))) AS Qty
FROM Registry Where Id=26
输出:
A1 UPC Date Qty
-------------------------------------
CPU1,01/15,3 CPU1 01/15 3
这是我目前的存储过程
SP:
ALTER PROCEDURE [dbo].[SP_UPD_Compartment]
@Id int,
@Col_Name char(40)
AS
BEGIN
SET NOCOUNT ON;
SELECT
@Col_Name,
LEFT (@Col_Name,CHARINDEX(',',@Col_Name)-1) AS UPC,
SUBSTRING(@Col_Name,CHARINDEX(',', @Col_Name , 1) + 1,LEN(@Col_Name) - CHARINDEX(',', @Col_Name) - CHARINDEX(',', REVERSE(@Col_Name))) AS Date,
SUBSTRING(@Col_Name,CHARINDEX(',', @Col_Name , 1) + 7,LEN(@Col_Name) - CHARINDEX(',', @Col_Name) - CHARINDEX(',', REVERSE(@Col_Name))) AS Qty
FROM Registry Where Id=@Id
END
错误信息:
Msg 537, Level 16, State 2, Procedure SP_UPD_Compartment, Line 9
Invalid length parameter passed to the LEFT or SUBSTRING function.
我是从选项卡输入的,所以可能会有一些语法错误,但我想你会明白的。首先,您使用语句创建一个字符串,然后将子字符串“@Col_Name”替换为传递给过程的参数。然后你执行那个动态 sql。您还可以在 EXEC(@cmd)
之前添加 Print @cmd
以查看实际将执行的内容。
ALTER PROCEDURE [dbo].[SP_UPD_Compartment]
@Id INT,
@Col_Name CHAR(40)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @cmd NVARCHAR(4000) =
'SELECT
@Col_Name,
LEFT (@Col_Name,CHARINDEX('','',@Col_Name)-1) AS UPC,
SUBSTRING(@Col_Name,CHARINDEX('','', @Col_Name , 1) + 1,LEN(@Col_Name) - CHARINDEX('','', @Col_Name) - CHARINDEX('','', REVERSE(@Col_Name))) AS Date,
SUBSTRING(@Col_Name,CHARINDEX('','', @Col_Name , 1) + 7,LEN(@Col_Name) - CHARINDEX('','', @Col_Name) - CHARINDEX('','', REVERSE(@Col_Name))) AS Qty
FROM Registry WHERE Id=' + CAST(@Id AS NVARCHAR(20))
SET @cmd = REPLACE(@cmd, '@Col_Name', @Col_Name)
EXEC(@cmd)
END