私はあなたのための作業コードを書いています。テストされていないSQLインジェクションの対象となるプロダクションシステムで使用する前に、さらに開発することをお勧めします。
@OrderBy:SQLで許可されたとして、あなたはまた、
@Columnsを(order by 1 ASC
が動作します)序を使用することができます:あなたは
さらなる開発は、テーブル名に別の変数を追加することができ序や列名を使用することのいずれか、例えば。
CREATE PROCEDURE dbo.Sample_Procedure
@Orderby nvarchar(100) = 'Name Asc',
@Columns nvarchar(100) = '1,2,3,Name'
AS
DECLARE @SQLString nvarchar(500)
DECLARE @UsedColumns nvarchar(500)
DECLARE @X xml
/*
Using string manipulation and covert to transform @Columns to xml,
so 1,2,3 becomes: <root><s>1</s><s>2</s><s>2</s></root> and then
converted to XML so we can select from it as if it was a table.
if you have SQL 2016 it's possible to replace it with STRING_SPLIT
*/
SELECT @X = CONVERT(xml,' <root> <s>' + REPLACE(@Columns,',','</s> <s>') + '</s> </root> ')
DECLARE @ColsTab as TABLE (Col nvarchar(100))
/*This part "shreds" the xml above into the variable table @ColsTab.
we need it for the `IN' operator later.
*/
INSERT into @ColsTab (col)
SELECT T.c.value('.','varchar(20)') FROM @X.nodes('/root/s') T(c)
SET @UsedColumns = STUFF( (SELECT ',' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='tblStaging'
and (COLUMN_NAME in (Select Col from @ColsTab)
or ORDINAL_POSITION in (Select iif(IsNumeric(Col)=1,Col,Null) from @ColsTab)
)
FOR XML PATH('')),
1, 1, '')
SET @SQLString = 'Select '+ @UsedColumns +'
from tblStaging
order by '[email protected]+'
FOR XML RAW (''TRAN''), ROOT (''SEPA''), ELEMENTS';
EXECUTE sp_executesql @SQLString
RETURN
同じクエリ、今回動的問合せは、出力列の順序を設定している:
CREATE PROCEDURE dbo.Sample_Procedure2
@Orderby nvarchar(100) = 'Name Asc',
@Columns nvarchar(100) = '2,3,Name'
AS
DECLARE @SQLString nvarchar(500)
DECLARE @UsedColumns nvarchar(500)
DECLARE @X xml
/*
Using string manipulation and covert to transform @Columns to xml,
so 1,2,3 becomes: <root><s>1</s><s>2</s><s>2</s></root> and then
converted to XML so we can select from it as if it was a table.
if you have SQL 2016 it's possible to replace it with STRING_SPLIT
*/
SELECT @X = CONVERT(xml,' <root> <s>' + REPLACE(@Columns,',','</s> <s>') + '</s> </root> ')
DECLARE @ColsTab as TABLE (Col nvarchar(100))
/*This part "shreds" the xml above into the variable table @ColsTab.
we need it for the `IN' operator later.
*/
INSERT into @ColsTab (col)
SELECT T.c.value('.','varchar(20)') FROM @X.nodes('/root/s') T(c)
/* This version usues left join to assume the same order of
columns as specified in the input field @Columns
be mindful not to specify the same field twice
*/
SET @UsedColumns = STUFF( (
SELECT ',' + i.COLUMN_NAME
FROM @ColsTab as c
LEFT JOIN INFORMATION_SCHEMA.COLUMNS as i
ON i.COLUMN_NAME = Col
OR ORDINAL_POSITION = iif(IsNumeric(Col)=1,Col,Null)
WHERE TABLE_NAME='tblStaging'
AND COLUMN_NAME is not null
FOR XML PATH('')),
1, 1, '')
SET @SQLString = 'Select '+ @UsedColumns +'
from tblStaging
order by '[email protected]+'
FOR XML RAW (''TRAN''), ROOT (''SEPA''), ELEMENTS';
EXECUTE sp_executesql @SQLString
RETURN
は、より多くの情報が必要。データの目的は何ですか?あなたはすべての結果を必要としますか?フレームワークレベルで注文を処理できない理由はありますか? –