は私がSUBSTRINGを嫌いどのくらい忘れてしまったが、その後として真に価値がで始まる位置を<starting_position>
を読むために、私の闘争されていること。
しかし、実際の獣は、@@TRANCOUNT
のコンテキストでSQL Serverで文字列操作をどのように実装するかということでした。
我々は適切な命名規則を使用したいが、関数は返します
`[My__Table]`
はなぜ? REPLACE
は重複の長さを先にジャンプするためです。それを証明するために、CHAR(95)
「_」1以上を追加することができますし、私たちはお返しにこれを取得する:
`[My___Table]`
それでは単にWHILE文でこれを埋め込む、例えば、我々のニーズのために非常に十分であろう。 注私は読みやすくするために '_' とスペースを置き換える
DECLARE @instr varchar(max)
SET @instr = 'SELECT * from employee A where A.age > 30 AND AND A.role = ''developer'''
DECLARE @workstr varchar(max) = REPLACE(LTRIM(@instr), ' ', '_'),
@tokenque VARCHAR(MAX),
@newstr INT = 0,
@token varchar(max),
@flag_break INT = 0
-- removes the extra "spaces"
WHILE CHARINDEX('__', @workstr) <> 0
BEGIN
SET @workstr = REPLACE(@workstr, '__' , '_')
END
SET @tokenque = @workstr
WHILE (CHARINDEX('_', @tokenque) <> 0)
BEGIN
SET @token = SUBSTRING(@tokenque, 1, CHARINDEX('_', @Tokenque) - 1)
IF @token <> '''' -- (') delimiter skipped
BEGIN
WHILE CHARINDEX(@token + '_' + @token, @workstr) <> 0
BEGIN
SET @workstr = REPLACE(@workstr, @token + '_' + @token, @token)
END
SET @tokenque = SUBSTRING(@tokenque, LEN(@token) + 2, LEN(@tokenque))
END
ELSE SET @tokenque = SUBSTRING(@tokenque, LEN(@token) + 2, LEN(@tokenque))
PRINT @tokenque --if you want to see the progression
END
PRINT REPLACE(@workstr, '_', ' ')
結果:このような
'SELECT * from employee A where A.age > 30 AND A.role = 'developer'
間違った結果の上に修正を「パッチする」のではなく、**実際のバグ**(コアの問題)を修正してください! –
このクエリの生成方法。?? – Wanderer
@ Mark_sに同意しますが、パッチを追加することで問題を管理するのは正しくありません。動的SQLが作成される場所を確認してください。 http://www.kodyaz.com/articles/build-sql-server-dynamic-sql-query-example.aspx動的SQL問合せがビルドされ、「WHERE」句と「AND」句が注意深く処理される場所を確認できます。 – Eralper